home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / kernel / xoper20.2 < prev    next >
Internet Message Format  |  1989-10-28  |  65KB

  1. Path: xanth!ames!sun-barr!newstop!sun!swap!root
  2. From: root%swap@Sun.COM (Operator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i191:  xoper - examine & control your kernel, Part02/03
  5. Message-ID: <127006@sun.Eng.Sun.COM>
  6. Date: 28 Oct 89 07:15:51 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 2821
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: g35@dhdurz1@bitnet (Werner Guenther)
  12. Posting-number: Volume 89, Issue 191
  13. Archive-name: kernel/xoper20.2
  14.  
  15. # This is a shell archive.
  16. # Remove anything above and including the cut line.
  17. # Then run the rest of the file through 'sh'.
  18. # Unpacked files will be owned by you and have default permissions.
  19. #----cut here-----cut here-----cut here-----cut here----#
  20. #!/bin/sh
  21. # shar: SHell ARchive
  22. # Run the following text through 'sh' to create:
  23. #    xoper.a2
  24. # This is archive 2 of a 3-part kit.
  25. # This archive created: Fri Oct 27 23:48:52 1989
  26. echo "extracting xoper.a2"
  27. sed 's/^X//' << \SHAR_EOF > xoper.a2
  28. X3$        bra     restart
  29. X
  30. X;fill all unused memory-chunks with a longword
  31. Xclear        moveq   #0,d0
  32. X        cmp.b   #10,0(a0)
  33. X        beq.s   clr5
  34. X        bsr     readhex
  35. X        tst.b   d7
  36. X        beq     syntax
  37. Xclr5        move.l  _SysBase(PC),a0
  38. X        clr.l   parmtxt
  39. X        lea     322(a0),a0
  40. X        move.w  #$4000,$dff09a
  41. Xclr1        move.l  0(a0),a0
  42. X        tst.l   0(a0)
  43. X        beq.s   clr4
  44. X        move.l  16(a0),a1
  45. Xclr2        tst.l   0(a1)
  46. X        beq.s   clr1
  47. X        addq.l  #1,parmtxt
  48. X        move.l  4(a1),d1
  49. X        subq.l  #8,d1
  50. X        beq.s   clr31
  51. X        lsr.l   #2,d1
  52. X        subq.l  #1,d1
  53. X        lea     8(a1),a2
  54. Xclr3        move.l  d0,(a2)+
  55. X        dbf     d1,clr3
  56. Xclr31        move.l  0(a1),a1
  57. X        bra.s   clr2
  58. Xclr4        move.w  #-$4000,$dff09a
  59. X        move.l  parmtxt(PC),d0
  60. X        bsr     bytedec
  61. X        move.l  #clrtxt,d0
  62. X        bra     putnam
  63. X
  64. X;change the number of maximum lines in the history buffer
  65. Xhistorylines
  66. X        bsr     getnum
  67. X        tst.b   d7
  68. X        beq     syntax
  69. X        move.w  d2,maxhlines
  70. X        move.w  hnum(PC),d0
  71. X1$        cmp.w   maxhlines(PC),d0
  72. X        ble.s   2$
  73. X        bsr     remhistline
  74. X        subq    #1,d0
  75. X        bra.s   1$
  76. X2$        move.l  history+8,curhist
  77. X        move.w  d0,hnum
  78. X        rts
  79. X;set the minimum number of characters a input line
  80. X;must have to be added to the history buffer
  81. Xhistorylength
  82. X        bsr     getnum
  83. X        tst.b   d7
  84. X        beq     syntax
  85. X        tst.b   d2
  86. X        bne.s   1$
  87. X        addq    #1,d2
  88. X1$        move.w  d2,minnumchars
  89. X        rts
  90. X;display all lines in the history buffer
  91. Xshowhistory move.l  history(PC),a5
  92. X        moveq   #1,d5
  93. X1$        tst.l   0(a5)
  94. X        beq.s   2$
  95. X        move.l  d5,d3
  96. X        bsr     bytedec
  97. X        move.w  8(a5),d0
  98. X        ext.l   d0
  99. X        lea     10(a5),a0
  100. X        lea     inputbuffer,a1
  101. X        CALL    CopyMem,_SysBase(PC)
  102. X        move.w  8(a5),d0
  103. X        lea     inputbuffer,a1
  104. X        clr.b   0(a1,d0.w)
  105. X        move.l  a1,d0
  106. X        bsr     putnam
  107. X        addq    #1,d5
  108. X        move.l  0(a5),a5
  109. X        bra.s   1$
  110. X2$        rts
  111. X
  112. X;set the maximum lines the output buffer may hold
  113. Xoutputlines bsr     getnum
  114. X        tst.b   d7
  115. X        beq     syntax
  116. X        moveq   #100,d3
  117. X        tst.l   d2
  118. X        bmi.s   2$
  119. X        cmp.l   d3,d2
  120. X        bge.s   1$
  121. X2$        move.l  d3,d2
  122. X1$        move.l  d2,maxlines
  123. X        rts
  124. X
  125. X;find a named node
  126. X;d7 = number of lists to search through
  127. X;a4 = pointer to the first entry in the
  128. X;     list-offset-table
  129. X;a5 = pointer to name
  130. X;returns:
  131. X;d7 = TRUE/FALSE 1/0
  132. X;d0 = node
  133. X
  134. Xfindnam     tst.b   0(a5)
  135. X        bne.s   1$
  136. X        move.l  #nameerr,d0
  137. X        bsr     putnam
  138. X        bra     fnerr
  139. X1$        cmp.b   #'$',0(a5)
  140. X        bne.s   fn2
  141. X        move.l  d7,d2
  142. X        move.l  a5,a0
  143. X        bsr     readhex
  144. X        tst.b   d7
  145. X        beq.s   fn6
  146. X        move.l  d2,d7
  147. X        bsr     tstnode
  148. X        tst.l   d5
  149. X        bne.s   fn3
  150. X        bra     fn5
  151. Xfn6        move.l  d2,d7
  152. Xfn2        move.l  _SysBase(PC),a0
  153. X        adda.l  0(a4),a0
  154. X        move.l  a5,a1
  155. Xfn4        CALL    FindName,_SysBase(PC)
  156. X        tst.l   d0
  157. X        bne.s   fn1
  158. X        addq    #4,a4
  159. X        dbf     d7,fn2
  160. Xfn5        move.l  #namerr,d0
  161. X        bsr     putstr
  162. X        move.l  a5,d0
  163. X        bsr     putnam
  164. Xfnerr        clr.b   d7
  165. X        rts
  166. Xfn1        move.b  procnum(PC),d2
  167. X        beq.s   fn3
  168. X        move.l  d0,a0
  169. X        cmp.b   143(a0),d2
  170. X        bne.s   fn4
  171. Xfn3        moveq.l #1,d7
  172. X        rts
  173. X
  174. X;list-offset-table
  175. XTRuNode     dc.l    276
  176. XTReNode     dc.l    406
  177. XTWaNode     dc.l    420
  178. XDevNode     dc.l    350
  179. XLibNode     dc.l    378
  180. XResNode     dc.l    336
  181. XMemNode     dc.l    322
  182. XPorNode     dc.l    392
  183. XSemNode     dc.l    532
  184. X
  185. X;Node has been entered in hex. Check if this node exsists
  186. Xtstnode     tst.b   fromfile
  187. X        bne.s   illegalhex
  188. X        move.l  d0,d1
  189. X        btst    #0,d1
  190. X        beq.s   inrange
  191. X        move.l  #adrerr,d0
  192. X        bsr     putnam
  193. Xillegalhex  moveq   #0,d5
  194. X        rts
  195. Xinrange     movem.l d7/a4,-(a7)
  196. X        cmp.l   #TRuNode,a4
  197. X        bne.s   inrange1
  198. X        move.l  _SysBase(PC),a0
  199. X        cmp.l   276(a0),d0
  200. X        beq.s   nodefound
  201. X        subq    #1,d7
  202. X        addq    #4,a4
  203. Xinrange1    move.w  #$4000,$dff09a
  204. Xgetlist     move.l  _SysBase(PC),a0
  205. X        add.l   0(a4),a0
  206. Xnxtnode     tst.l   0(a0)
  207. X        beq.s   nxtlist
  208. X        cmp.l   a0,d0
  209. X        beq.s   nodefound
  210. X        move.l  0(a0),a0
  211. X        bra.s   nxtnode
  212. Xnxtlist     addq    #4,a4
  213. X        dbf     d7,getlist
  214. X        move.w  #-$4000,$dff09a
  215. X        movem.l d0/d7/a4,-(a7)
  216. X        bsr     ResumeOutput
  217. X        move.l  #noderr,d0
  218. X        bsr     putnam
  219. X        bsr     readline
  220. X        movem.l (a7)+,d0/d7/a4
  221. X        cmp.b   #'y',inputbuffer
  222. X        beq.s   nodefound1
  223. X        moveq   #0,d5
  224. X        movem.l (a7)+,d7/a4
  225. X        rts
  226. Xnodefound   move.w  #-$4000,$dff09a
  227. Xnodefound1  move.b  #1,d5
  228. Xetst        movem.l (a7)+,d7/a0
  229. X        rts
  230. X
  231. X;allocate FileInfoBlock
  232. Xallocfinfo  move.l  #260,d0
  233. X        moveq   #0,d1
  234. X        CALL    AllocMem,_SysBase(PC)
  235. X        move.l  d0,finfoptr
  236. X        rts
  237. X
  238. X;free FileInfoBlock
  239. Xfreefinfo   move.l  #260,d0
  240. X        move.l  finfoptr(PC),d1
  241. X        beq.s   1$
  242. X        move.l  d1,a1
  243. X        CALL    FreeMem,_SysBase(PC)
  244. X1$        rts
  245. X
  246. X;Examine ,d0=Lock
  247. Xgetfinfo    move.l  d0,d1
  248. X        move.l  finfoptr,d2
  249. X        CALL    Examine,dosbase(PC)
  250. X        rts
  251. X
  252. X;construct a Pathname from a lock
  253. X;d0=Lock ,resulting string is written to window
  254. Xgetpath     movem.l d1-d7/a0-a6,-(a7)
  255. X        move.l  d0,d1
  256. X        beq.s   1$
  257. X        CALL    DupLock,dosbase(PC)
  258. X1$        lea     out,a4
  259. X        clr.b   -(a4)
  260. Xgp0        move.l  d0,-(a7)
  261. X        bsr     getfinfo
  262. X        move.l  finfoptr,a0
  263. X        move.l  4(a0),d4
  264. X        addq    #8,a0
  265. X        bsr     strlen
  266. X        lea     -1(a4),a5
  267. X        tst.l   d4
  268. X        bmi.s   nodir
  269. X        move.b  #'/',-(a4)
  270. Xnodir        subq    #1,d0
  271. X        bmi.s   nofnam
  272. Xgp1        move.b  0(a0,d0),-(a4)
  273. X        dbf     d0,gp1
  274. Xnofnam        move.l  0(a7),d1
  275. X        CALL    ParentDir,dosbase(PC)
  276. X        move.l  d0,d4
  277. X        move.l  (a7)+,d1
  278. X        beq.s   2$
  279. X        CALL    UnLock,dosbase(PC)
  280. X2$        move.l  d4,d0
  281. X        bne     gp0
  282. Xputall        cmp.b   #'/',0(a5)
  283. X        bne.s   gp2
  284. X        move.b  #':',0(a5)
  285. Xgp2        move.l  a4,d0
  286. X        bsr     putnam
  287. X        movem.l (a7)+,d1-d7/a0-a6
  288. X        rts
  289. Xstrlen        move.l  a0,-(a7)
  290. X        move.l  #-1,d0
  291. Xstrl2        addq.l  #1,d0
  292. X        tst.b   (a0)+
  293. X        bne.s   strl2
  294. X        move.l  (a7)+,a0
  295. X        rts
  296. Xstrlen2     move.l  a0,-(a7)
  297. X        move.l  #-1,d0
  298. Xstrl22        addq.l  #1,d0
  299. X        cmp.b   #10,(a0)+
  300. X        bne.s   strl22
  301. X        move.l  (a7)+,a0
  302. X        rts
  303. X
  304. X;write a title and underline
  305. X;a0 = pointer to text
  306. Xputhead1    bsr     strlen
  307. X        move.l  d0,d5
  308. X        move.l  a0,d0
  309. X        bra     putstr
  310. X
  311. Xputhead2    bsr     strlen
  312. X        add.l   d0,d5
  313. X        bra.s   ph2
  314. X
  315. Xputhead     bsr     strlen
  316. X        move.l  d0,d5
  317. Xph2        move.l  a0,d0
  318. X        bsr     putnam
  319. X        lea     out,a0
  320. X        move.l  a0,d0
  321. Xph1        move.b  #'-',(a0)+
  322. X        dbf     d5,ph1
  323. X        move.b  #$0a,(a0)+
  324. X        clr.b   0(a0)
  325. X        bra     putstr
  326. X
  327. X;move cursor to a column
  328. X;d0 = current position
  329. X;d1 = column
  330. Xtab        move.l  a3,-(a7)
  331. X        lea     out,a3
  332. Xsp5        cmp.b   d1,d0
  333. X        bcc.s   sp4
  334. X        move.b  #' ',0(a3,d0)
  335. X        addq.b  #1,d0
  336. X        bra.s   sp5
  337. Xsp4        move.l  d1,ptr
  338. X        move.l  (a7)+,a3
  339. X        rts
  340. X
  341. X;convert ascii to byte
  342. X;a0 = pointer to text
  343. X;d0 = byte
  344. Xgetnum        cmp.b   #'$',0(a0)
  345. X        bne.s   isdec
  346. X        bsr     readhex
  347. X        move.l  d0,d2
  348. X        rts
  349. Xisdec        moveq   #0,d2
  350. X        move.l  d2,d3
  351. X        move.l  d2,d6
  352. X        move.l  d2,d7
  353. X        cmp.b   #'-',0(a0)
  354. X        bne.s   gn1
  355. X        addq    #1,a0
  356. X        moveq.l #1,d6
  357. Xgn1        move.b  (a0)+,d3
  358. X        cmp.b   #'9',d3
  359. X        bhi.s   gn2
  360. X        cmp.b   #'0',d3
  361. X        bcs.s   gn2
  362. X        moveq   #1,d7
  363. X        and.b   #$f,d3
  364. X        muls    #10,d2
  365. X        add.l   d3,d2
  366. X        bra.s   gn1
  367. Xgn2        tst.b   d6
  368. X        beq.s   gn3
  369. X        neg.l   d2
  370. Xgn3        tst.b   d7
  371. X        bne.s   gn4
  372. X        subq    #1,a0
  373. Xgn4        rts
  374. X
  375. X;convert hex to longword
  376. X;a0 = pointer to text
  377. X;returns d0=value
  378. X;d7 = ok/error 1/0
  379. Xreadhex     movem.l d1-d6/a1-a5,-(a7)
  380. X        moveq   #1,d7
  381. X        cmp.b   #'$',0(a0)
  382. X        bne.s   rh3
  383. X        addq    #1,a0
  384. Xrh3        moveq   #0,d0
  385. X        cmpi.b  #10,0(a0)
  386. X        beq.s   rherr
  387. X        lea     hextab(pc),a1
  388. Xrh0        move.b  (a0)+,d3
  389. X        moveq.l #15,d2
  390. Xrh1        cmp.b   0(a1,d2),d3
  391. X        beq.s   rh2
  392. X        dbf     d2,rh1
  393. X        bra     rhend
  394. Xrh2        lsl.l   #4,d0
  395. X        or.b    d2,d0
  396. X        bra.s   rh0
  397. Xrhend        tst.b   d3
  398. X        beq.s   rhok
  399. X        cmpi.b  #10,d3
  400. X        beq.s   rhok
  401. X        cmpi.b  #' ',d3
  402. X        beq.s   rhok
  403. Xrherr        moveq   #0,d7
  404. Xrhok        movem.l (a7)+,d1-d6/a1-a5
  405. X        rts
  406. X
  407. X;skip blanks
  408. X;a0 pointer to text
  409. X; returns a0 = new pointer position
  410. Xkllblnks    cmpi.b  #' ',0(a0)
  411. X        bne.s   gn4
  412. X        addq    #1,a0
  413. X        bra.s   kllblnks
  414. X
  415. X; exit program. If background flag is set, wait for
  416. X; amiga-amiga-x
  417. X
  418. Xstopall     addq    #4,a7
  419. X        bra     exitall
  420. X
  421. Xexit        tst.b   background
  422. X        bne     quithold
  423. Xexitall     bsr     killpage
  424. X        bsr     freeblank
  425. X        bsr     killhistory
  426. X        move.l  stplist(PC),a3
  427. X        tst.l   0(a3)
  428. X        beq.s   ex0
  429. X        move.l  a3,d0
  430. X        bsr     waok
  431. X        bra.s   exitall
  432. X
  433. Xex0        tst.b   background
  434. X        beq.s   ex1
  435. X        bsr     removeh
  436. X
  437. Xex1        move.l  _SysBase(PC),a1
  438. X        move.l  #_LVOSwitch,a0
  439. X        move.l  oldswitch,d0
  440. X        CALL    SetFunction,_SysBase(PC)
  441. X        moveq   #3,d0
  442. X        lea     IOCounter(PC),a1
  443. X        CALL    RemIntServer,_SysBase(PC)
  444. X
  445. X        move.l  replyport(PC),-(a7)
  446. X        LIBCALL DeletePort
  447. X        addq    #4,a7
  448. X        bsr     stoptimer
  449. X        lea     timerio,a1
  450. X        CALL    CloseDevice,_SysBase(PC)
  451. X        move.l  timerport(PC),-(a7)
  452. X        LIBCALL DeletePort
  453. X        addq    #4,a7
  454. X
  455. X        bsr     restoretrap
  456. X
  457. X        tst.l   wnptr
  458. X        beq.s   5$
  459. X        move.l  wnptr(PC),a0
  460. X        CALL    CloseWindow,intuibase(PC)
  461. X5$        tst.b   ownscreen
  462. X        beq.s   6$
  463. X        move.l  screenptr(PC),a0
  464. X        CALL    CloseScreen,intuibase(PC)
  465. X        clr.l   screenptr
  466. X
  467. X6$        move.l  fileptr(PC),d1
  468. X        beq.s   ex11
  469. X        CALL    Close,dosbase(PC)
  470. Xex11        bsr     freehidmem
  471. X        bsr     freealias
  472. X        move.l  realstack(PC),a7
  473. X    IFND DEBUG
  474. X        CALL    Forbid,_SysBase(PC)
  475. X        move.l  wbmsg(PC),d0
  476. X        beq.s   todos
  477. X        move.l  d0,a1
  478. X        CALL    ReplyMsg,_SysBase(PC)
  479. X        moveq   #0,d0
  480. X        rts
  481. X
  482. Xtodos        move.l  myseg(PC),d1
  483. X        CALL    UnLoadSeg,dosbase(PC)
  484. X    ENDC
  485. X        moveq   #0,d0
  486. X        rts
  487. X
  488. X;print a bcpl-string
  489. X;d0 = bcpl-pointer to bcpl-string
  490. Xputbcpl     movem.l d3/a0-a1,-(a7)
  491. X        tst.l   d0
  492. X        beq.s   pb1
  493. X        lsl.l   #2,d0
  494. X        move.l  d0,a1
  495. X        moveq   #0,d3
  496. X        move.b  (a1)+,d3
  497. X        subq    #1,d3
  498. X        move.l  ptr(PC),d0
  499. X        lea     out,a0
  500. Xpb2        move.b  (a1)+,0(a0,d0)
  501. X        beq.s   1$
  502. X        addq.b  #1,d0
  503. X        dbf     d3,pb2
  504. X1$        move.l  d0,ptr
  505. Xpb1        movem.l (a7)+,d3/a0-a1
  506. X        rts
  507. X
  508. X;compare strings
  509. X;a0/a1 = pointers to string
  510. X;returns d0 = true(0) false(1), d1 = length
  511. Xstrcmp        movem.l a0-a1,-(a7)
  512. X        moveq   #0,d0
  513. X        move.l  d0,d1
  514. Xsrc2        move.b  (a0)+,d0
  515. X        beq.s   src1
  516. X        cmp.b   #10,d0
  517. X        beq.s   src1
  518. X        addq    #1,d1
  519. X        cmp.b   (a1)+,d0
  520. X        beq.s   src2
  521. X        bra.s   src3
  522. Xsrc1        move.b  0(a1),d0
  523. Xsrc3        movem.l (a7)+,a0-a1
  524. X        rts
  525. X
  526. Xstrbuf        movem.l d0/a1-a2,-(a7)
  527. X        move.l  a0,a1
  528. X        lea     buffer,a2
  529. X1$        move.b  (a1)+,d0
  530. X        cmp.b   #10,d0
  531. X        beq.s   2$
  532. X        cmp.b   #' ',d0
  533. X        beq.s   2$
  534. X        or.b    #' ',d0
  535. X        beq.s   2$
  536. X        move.b  d0,(a2)+
  537. X        bra.s   1$
  538. X2$        clr.b   (a2)+
  539. X        movem.l (a7)+,d0/a1-a2
  540. X        rts
  541. X
  542. X;compare bcpl string with string
  543. X;a0 = pointer to string
  544. X;a2 = bcpl-pointer to bcpl-string
  545. X;returns d0 = true(0) false(1)
  546. Xstrbcmp     movem.l d1/a0/a2,-(a7)
  547. X        moveq   #0,d0
  548. X        moveq   #0,d1
  549. X        adda.l  a2,a2
  550. X        adda.l  a2,a2
  551. X        move.b  (a2)+,d1
  552. X        beq.s   stb1
  553. X        subq    #1,d1
  554. Xstb2        cmp.b   (a2)+,(a0)+
  555. X        bne.s   stb1
  556. X        dbf     d1,stb2
  557. X        moveq   #1,d0
  558. Xstb1        movem.l (a7)+,d1/a0/a2
  559. X        rts
  560. X
  561. X;convert long to decimal
  562. X;d0 = value
  563. X;d3 bit 0 = left/right justified
  564. X;d3 bit 1 = write/leave
  565. X;returns string in 'buffer'
  566. Xlongdec     movem.l d1-d2/a1-a2,-(a7)
  567. X        lea     binarea+8(PC),a1
  568. X        move.l  #'    ',-8(a1)
  569. X        move.l  #'    ',-4(a1)
  570. X        clr.b   0(a1)
  571. X        subq    #1,a1
  572. X        cmp     #2,d3
  573. X        bne.s   ld5
  574. X        clr.b   0(a1)
  575. Xld5        moveq   #1,d2
  576. Xld2        addq    #1,d2
  577. X        moveq   #$a,d1
  578. X        bsr     div
  579. X        addi.l  #$30,d1
  580. X        move.b  d1,-(a1)
  581. X        tst.l   d0
  582. X        bne.s   ld2
  583. X
  584. X        btst    #0,d3
  585. X        bne.s   ld1
  586. X        lea     binarea(PC),a2
  587. X        cmpa.l  a2,a1
  588. X        bne.s   ld3
  589. X        subq.l  #1,ptr
  590. X        bra.s   ld1
  591. Xld3        move.b  0(a1),(a2)+
  592. X        move.b  #' ',(a1)+
  593. X        dbf     d2,ld3
  594. Xld1        cmp     #2,d3
  595. X        beq.s   ld4
  596. X        move.l  #binarea,d0
  597. X        bsr     putstr
  598. Xld4        movem.l (a7)+,d1-d2/a1-a2
  599. X        rts
  600. X
  601. X;write UBYTE
  602. X;d3 = value
  603. Xbytedec     bsr     dec
  604. X        move.l  #decimal,d0
  605. X        bra.s   pm1
  606. X
  607. X;write signed byte
  608. X;d3 = value
  609. Xplusmins    movem.l d5/a3,-(a7)
  610. X        move.w  #$2020,minus
  611. X        move.b  d3,d5
  612. X        bpl.s   2$
  613. X        neg.b   d3
  614. X2$        bsr.s   dec
  615. X        tst.b   d5
  616. X        bpl.s   1$
  617. X        move.l  d0,a3
  618. X        move.b  #'-',-(a3)
  619. X1$        movem.l (a7)+,d5/a3
  620. X        move.l  #minus+1,d0
  621. Xpm1        bra     putstr
  622. X
  623. Xdec        movem.l d3/a3,-(a7)
  624. X        move.l  #$20202020,decimal
  625. X        and.l   #$ff,d3
  626. X        lea     decimal+3(PC),a3
  627. Xbloop        tst.b   d3
  628. X        beq.s   bend
  629. X        divu    #10,d3
  630. X        swap    d3
  631. X        ori.b   #'0',d3
  632. X        move.b  d3,-(a3)
  633. X        clr.w   d3
  634. X        swap    d3
  635. X        bra.s   bloop
  636. Xbend        cmpa.l  #decimal+3,a3
  637. X        bne     1$
  638. X        move.b  #'0',-(a3)
  639. X1$        move.l  a3,d0
  640. X        movem.l (a7)+,d3/a3
  641. X        rts
  642. X
  643. X;write a string, move cursor into next line
  644. X;d0 = pointer to text
  645. Xputnam        bsr     putstr
  646. Xputnam1     tst.b   d0
  647. X        beq.s   ncr
  648. X        bsr     newline
  649. Xncr        rts
  650. X
  651. X;write one char
  652. X;d0 = char
  653. Xputchar     movem.l d1/a0,-(a7)
  654. X        move.l  ptr(PC),d1
  655. X        lea     out,a0
  656. X        move.b  d0,0(a0,d1)
  657. X        addq.l  #1,ptr
  658. X        movem.l (a7)+,d1/a0
  659. X        rts
  660. X
  661. X;write a string, strings are only put into the output buffer when
  662. X;a LF is detected
  663. X;d0 = pointer to string
  664. X;returns d0 = cursor position
  665. Xputstr        movem.l d1-d7/a0-a6,-(a7)
  666. X        move.b  #1,printed
  667. X        move.l  d0,a2
  668. X        lea     out,a3
  669. X        move.l  ptr(PC),d0
  670. X        move.l  a2,d5
  671. X        bne     pst1
  672. X        lea     longnix(PC),a2
  673. X
  674. Xpst1        move.b  (a2)+,d1
  675. X        cmpi.b  #13,d1
  676. X        beq     pst1
  677. X        cmpi.b  #10,d1
  678. X        beq.s   lineend
  679. X        move.b  d1,0(a3,d0)
  680. X        beq     prend
  681. X        cmp     #100,d0
  682. X        bge.s   pst1
  683. X        addq    #1,d0
  684. X        bra.s   pst1
  685. X
  686. Xlineend     tst.b   fromfile
  687. X        beq.s   1$
  688. X        moveq   #0,d0
  689. X        bra     prend
  690. X
  691. X1$        tst.l   lastprinted
  692. X        bne.s   2$
  693. X        bsr     killpage
  694. X
  695. X2$        addq    #1,d0
  696. X        move.l  d0,-(a7)
  697. X        add     #14,d0
  698. X        moveq   #0,d1
  699. X        CALL    AllocMem,_SysBase(PC)
  700. X        move.l  (a7)+,d1
  701. X        tst.l   d0
  702. X        beq     prend
  703. X        move.l  d0,a0
  704. X        move.w  d1,12(a0)
  705. X        cmp.w   maxllength(PC),d1
  706. X        ble.s   7$
  707. X        move.w  d1,maxllength
  708. X7$        move.l  node,8(a0)
  709. X        clr.l   node
  710. X        clr.l   0(a0)
  711. X
  712. X        move.l  lastprinted(PC),d0
  713. X        move.l  d0,4(a0)
  714. X        bne.s   3$
  715. X        move.l  a0,outchain
  716. X        bra.s   4$
  717. X3$        move.l  d0,a1
  718. X        move.l  a0,0(a1)
  719. X4$        move.l  a0,lastprinted
  720. X        move.b  #' ',14(a0)
  721. X        subq    #1,d1
  722. X        lea     15(a0),a0
  723. X        lea     out,a1
  724. X        subq    #1,d1
  725. X        bmi.s   6$
  726. X5$        move.b  (a1)+,(a0)+
  727. X        dbf     d1,5$
  728. X6$        move.l  numlines(PC),d2
  729. X        cmp.l   maxlines(PC),d2
  730. X        ble.s   8$
  731. X
  732. X        move.l  outchain(PC),a1
  733. X        move.l  0(a1),a2
  734. X        move.l  a2,outchain
  735. X        clr.l   4(a2)
  736. X        move.w  12(a1),d0
  737. X        add.w   #14,d0
  738. X        ext.l   d0
  739. X        CALL    FreeMem,_SysBase(PC)
  740. X        bra.s   9$
  741. X
  742. X8$        addq.l  #1,d2
  743. X        move.l  d2,numlines
  744. X
  745. X9$        moveq   #0,d0
  746. X        move.l  d0,d5
  747. X        tst.b   addlines
  748. X        beq     pst1
  749. X        bsr     addline
  750. X        bra     pst1
  751. Xprend        move.l  d0,ptr
  752. X        movem.l (a7)+,d1-d7/a0-a6
  753. X        rts
  754. X
  755. X;Kill output buffer
  756. Xkillpage    movem.l d0-d7/a0-a6,-(a7)
  757. X        tst.l   outchain
  758. X        beq.s   2$
  759. X        move.l  outchain(PC),a1
  760. X        bsr     killlines
  761. X        clr.l   outchain
  762. X        clr.l   lastprinted
  763. X        clr.l   numlines
  764. X        clr.w   maxllength
  765. X2$        movem.l (a7)+,d0-d7/a0-a6
  766. X        rts
  767. X
  768. X;kill the remainder of the output buffer
  769. Xkilllines   move.l  0(a1),-(a7)
  770. X        move.w  12(a1),d0
  771. X        ext.l   d0
  772. X        add     #14,d0
  773. X        CALL    FreeMem,_SysBase(PC)
  774. X        move.l  (a7)+,a1
  775. X        move.l  a1,d7
  776. X        bne.s   killlines
  777. X        rts
  778. X
  779. Xfreeblank   move.l  blanks(PC),d0
  780. X        beq.s   1$
  781. X        move.l  d0,a1
  782. X        move.w  colms(PC),d0
  783. X        ext.l   d0
  784. X        CALL    FreeMem,_SysBase(PC)
  785. X        clr.l   blanks
  786. X1$        rts
  787. X
  788. X;write a portion of the output buffer to the screen
  789. Xblastout    move.l  rastport(PC),a1
  790. X        moveq   #1,d0
  791. X        CALL    SetAPen,gfxbase(PC)
  792. X        move.l  rastport(PC),a1
  793. X        moveq   #1,d0
  794. X        CALL    SetDrMd,gfxbase(PC)
  795. X        moveq   #0,d7
  796. X
  797. X        move.w  loffset(PC),d2
  798. X        beq.s   7$
  799. X        move.w  colms(PC),d4
  800. X        add.w   d4,d2
  801. X        move.w  maxllength(PC),d3
  802. X        cmp.w   d3,d2
  803. X        ble.s   7$
  804. X        move.w  d3,d2
  805. X        sub.w   d4,d2
  806. X        bpl.s   8$
  807. X        moveq   #0,d2
  808. X8$        move.w  d2,loffset
  809. X
  810. X7$        bsr     tstfirstlin
  811. X
  812. X1$        tst.l   outchain
  813. X        beq.s   3$
  814. X        bsr     findline
  815. X
  816. X2$        move.w  colms(PC),d5
  817. X        ext.l   d5
  818. X        move.w  loffset(PC),d4
  819. X        ext.l   d4
  820. X        moveq   #18,d6
  821. X6$        lea     14(a5,d4),a0
  822. X        move.w  12(a5),d3
  823. X        ext.l   d3
  824. X        bsr     blastline
  825. X        bge.s   3$
  826. X        tst.l   0(a5)
  827. X        beq.s   5$
  828. X        move.l  0(a5),a5
  829. X        bra     6$
  830. X5$        moveq   #0,d3
  831. X        bsr     blastline
  832. X        bcs.s   5$
  833. X3$        rts
  834. X
  835. X;get a pointer to a line  (line # in d0)
  836. Xfindline    move.l  outchain(PC),d1
  837. X        beq     2$
  838. X        move.l  d1,a5
  839. X1$        tst     d0
  840. X        beq.s   2$
  841. X        tst.l   0(a5)
  842. X        beq.s   2$
  843. X        move.l  0(a5),a5
  844. X        dbf     d0,1$
  845. X2$        rts
  846. X
  847. X;check if the display is as 'full' as possible
  848. Xtstfirstlin move.l  firstline(PC),d0
  849. X        move.l  d0,d2
  850. X        add.w   rows(PC),d2
  851. X        cmp.l   numlines(PC),d2
  852. X        bmi.s   1$
  853. X        move.l  numlines(PC),d2
  854. X        sub.w   rows(PC),d2
  855. X        bpl.s   4$
  856. X        moveq   #0,d2
  857. X4$        move.l  d2,d0
  858. X        move.l  d2,firstline
  859. X1$        rts
  860. X
  861. X;display one line, fill the gap between the end of the line and
  862. X;the end of the window with spaces.
  863. X;d6 = ypos, d5=colms, d3= linelength, d7= line # in window, a0 = text
  864. X
  865. Xblastline   move    d6,d1
  866. X        moveq   #6,d0
  867. X        move.l  rastport(PC),a1
  868. X        CALL    Move,gfxbase(PC)
  869. X        sub.w   d4,d3
  870. X        bpl.s   7$
  871. X        moveq   #0,d3
  872. X        bra.s   6$
  873. X7$        cmp.w   d5,d3
  874. X        bmi.s   4$
  875. X        move.w  d5,d3
  876. X4$        move.l  d3,d0
  877. X        beq.s   6$
  878. X        CALL    Text,gfxbase(PC)
  879. X6$        move.l  d5,d0
  880. X        sub.l   d3,d0
  881. X        ble.s   5$
  882. X        move.l  blanks(PC),a0
  883. X        move.l  rastport(PC),a1
  884. X        CALL    Text,gfxbase(PC)
  885. X5$        addq    #8,d6
  886. X        addq    #1,d7
  887. X        cmp.w   rows(PC),d7
  888. X        rts
  889. X
  890. X;Write pointer, display '-------' if empty
  891. Xhexan        tst.l   d0
  892. X        bne.s   hexa
  893. X        bra     putstr
  894. X
  895. X;Write 8 byte hex value
  896. X;d0 = value
  897. Xhexa        bsr     gthex
  898. X        bra     putstr
  899. X
  900. Xgthex        movem.l d1-d7/a0-a6,-(a7)
  901. X        moveq.l #7,d5
  902. X        lea     hexarea(PC),a1
  903. X        lea     hextab(PC),a0
  904. X        moveq   #0,d2
  905. Xhexloop     move.b  d0,d2
  906. X        and.b   #15,d2
  907. X        move.b  0(a0,d2),0(a1,d5)
  908. X        lsr.l   #4,d0
  909. X        dbf     d5,hexloop
  910. X        move.l  a1,d0
  911. X        movem.l (a7)+,d1-d7/a0-a6
  912. X        rts
  913. X
  914. X;Convert/write byte into binary string
  915. X;d0 = value
  916. Xbin        movem.l d1-d7/a0-a6,-(a7)
  917. X        lea     binarea(PC),a0
  918. X        move.w  #$2020,8(a0)
  919. X        moveq.l #7,d4
  920. Xbinloop     moveq.l #'0'/2,d1
  921. X        roxr.b  #1,d0
  922. X        roxl.b  #1,d1
  923. X        move.b  d1,0(a0,d4)
  924. X        dbf     d4,binloop
  925. X        move.l  a0,d0
  926. X        movem.l (a7)+,d1-d7/a0-a6
  927. X        bra     putstr
  928. X
  929. X;send a packet
  930. X;a0 = msgport
  931. X;dp_Type and dp_Arg1 have to be inizialized
  932. Xcons1        movem.l d0-d7/a0-a6,-(a7)
  933. X        move.l  #dp_Link,LN_NAME
  934. X        move.l  #mypacket,dp_Link
  935. X        move.l  replyport(PC),dp_Port
  936. X        lea     mypacket,a1
  937. X        CALL    PutMsg,_SysBase(PC)
  938. X        move.l  replyport,a0
  939. X        CALL    WaitPort,_SysBase(PC)
  940. X        move.l  replyport(PC),a0
  941. X        CALL    GetMsg,_SysBase(PC)
  942. X        movem.l (a7)+,d0-d7/a0-a6
  943. X        rts
  944. X
  945. X;32-bit division
  946. X;d0 / d1
  947. X;returns d0
  948. Xdiv        movem.l d2-d3,-(a7)
  949. X        tst.l   d1
  950. X        beq     div8
  951. X        swap    d1
  952. X        move.w  d1,d2
  953. X        bne.s   div1
  954. X        swap    d0
  955. X        swap    d1
  956. X        swap    d2
  957. X        move.w  d0,d2
  958. X        beq.s   div2
  959. X        divu    d1,d2
  960. X        move.w  d2,d0
  961. Xdiv2        swap    d0
  962. X        move.w  d0,d2
  963. X        divu    d1,d2
  964. X        move.w  d2,d0
  965. X        swap    d2
  966. X        move.w  d2,d1
  967. X        bra     div8
  968. Xdiv1        moveq   #$10,d3
  969. X        cmpi.w  #$80,d1
  970. X        bcc.s   div3
  971. X        rol.l   #8,d1
  972. X        subq.w  #8,d3
  973. Xdiv3        cmpi.w  #$800,d1
  974. X        bcc.s   div4
  975. X        rol.l   #4,d1
  976. X        subq.w  #4,d3
  977. Xdiv4        cmpi.w  #$2000,d1
  978. X        bcc.s   div5
  979. X        rol.l   #2,d1
  980. X        subq.w  #2,d3
  981. Xdiv5        tst.w   d1
  982. X        bmi.s   div6
  983. X        rol.l   #1,d1
  984. X        subq.w  #1,d3
  985. Xdiv6        move.w  d0,d2
  986. X        lsr.l   d3,d0
  987. X        swap    d2
  988. X        clr.w   d2
  989. X        lsr.l   d3,d2
  990. X        swap    d3
  991. X        divu    d1,d0
  992. X        move.w  d0,d3
  993. X        move.w  d2,d0
  994. X        move.w  d3,d2
  995. X        swap    d1
  996. X        mulu    d1,d2
  997. X        sub.l   d2,d0
  998. X        bcc.s   div7
  999. X        subq.w  #1,d3
  1000. X        add.l   d1,d0
  1001. Xdiv7        moveq   #0,d1
  1002. X        move.w  d3,d1
  1003. X        swap    d3
  1004. X        rol.l   d3,d0
  1005. X        swap    d0
  1006. X        exg     d1,d0
  1007. Xdiv8        movem.l (a7)+,d2-d3
  1008. X        rts
  1009. X
  1010. X;install a input-handler
  1011. Xinstallh    pea     0
  1012. X        pea     xopsleep
  1013. X        LIBCALL CreatePort
  1014. X        addq    #8,a7
  1015. X        move.l  d0,InputMsg
  1016. X        move.l  d0,-(a7)
  1017. X        LIBCALL CreateStdIO
  1018. X        addq    #4,a7
  1019. X        move.l  d0,InRequest
  1020. X        move.l  d0,a1
  1021. X        lea     devicenam(PC),a0
  1022. X        moveq   #0,d0
  1023. X        moveq   #0,d1
  1024. X        CALL    OpenDevice,_SysBase(PC)
  1025. X        move.l  d0,devstatus
  1026. X        movea.l InRequest(PC),a1
  1027. X        move.l  #InInterrupt,40(a1)
  1028. X        move.w  #9,28(a1)
  1029. X        CALL    DoIO,_SysBase(PC)
  1030. X        move.l  d0,iostatus
  1031. X        move.l  #-1,d0
  1032. X        CALL    AllocSignal,_SysBase(PC)
  1033. X        moveq   #0,d1
  1034. X        bset    d0,d1
  1035. X        move.l  d1,mysignal
  1036. X        rts
  1037. X
  1038. X;remove handler
  1039. Xremoveh     movea.l InRequest(PC),a1
  1040. X        move.l  #InInterrupt,40(a1)
  1041. X        move.w  #10,28(a1)
  1042. X        CALL    DoIO,_SysBase(PC)
  1043. X        movea.l InRequest(PC),a1
  1044. X        CALL    CloseDevice,_SysBase(PC)
  1045. X        move.l  InRequest,-(a7)
  1046. X        LIBCALL DeleteStdIO
  1047. X        addq    #4,a7
  1048. X        move.l  InputMsg,-(a7)
  1049. X        LIBCALL DeletePort
  1050. X        addq    #4,a7
  1051. X        rts
  1052. X
  1053. X;this is the handler, it checks if amiga-amiga-x
  1054. X;has been pressed and signals it to our task
  1055. XKeyhandler  tst.b   running
  1056. X        bne.s   endhandler
  1057. X        cmp.b   #1,4(a0)
  1058. X        bne.s   endhandler
  1059. X        move.w  8(a0),d0
  1060. X        andi.w  #$c0,d0
  1061. X        cmpi.w  #$c0,d0
  1062. X        bne.s   endhandler
  1063. X        cmp.w   #$32,6(a0)
  1064. X        bne.s   endhandler
  1065. Xwakeup        move.l  a0,-(a7)
  1066. X        movea.l mytask(PC),a1
  1067. X        move.l  mysignal(PC),d0
  1068. X        CALL    Signal,_SysBase(PC)
  1069. X        move.l  (a7)+,a0
  1070. X        clr.b   4(a0)
  1071. Xendhandler  move.l  a0,d0
  1072. X        rts
  1073. X
  1074. Xsnoop        bsr     cls
  1075. X        bsr     nodenam
  1076. X        moveq   #1,d7
  1077. X        lea     TReNode(PC),a4
  1078. X        bsr     findnam
  1079. X        tst.b   d7
  1080. X        bne.s   1$
  1081. X        move.l  #stperr,d0
  1082. X        bra     putnam
  1083. X1$        move.l  d0,captask
  1084. X        pea     0
  1085. X        pea     memportname
  1086. X        LIBCALL CreatePort
  1087. X        addq    #8,a7
  1088. X        move.l  d0,snoopport
  1089. X        beq     tm6
  1090. X
  1091. X        bsr     replyintui
  1092. X        move.b  #1,addlines
  1093. X        lea     snoophead(PC),a0
  1094. X        bsr     puthead
  1095. X        move.l  _SysBase(PC),a1
  1096. X        move.l  -196(a1),oldalloc
  1097. X        move.l  -208(a1),oldfree
  1098. X        move.l  #capmalloc,d0
  1099. X        move.l  #-198,a0
  1100. X        CALL    SetFunction,_SysBase(PC)
  1101. X        move.l  _SysBase(PC),a1
  1102. X        move.l  #capmfree,d0
  1103. X        move.l  #-210,a0
  1104. X        CALL    SetFunction,_SysBase(PC)
  1105. X        clr.b   bool
  1106. X        clr.b   cbreak
  1107. X
  1108. Xwaitmem     move.l  snoopport(PC),a0
  1109. X        moveq   #0,d1
  1110. X        move.b  15(a0),d1
  1111. X        bset    d1,d0
  1112. X        move.l  d0,auxsig
  1113. X        bsr     processmsgs
  1114. X
  1115. Xtm7        move.l  mytask(PC),a0
  1116. X        move.l  snoopport(PC),a0
  1117. X        CALL    GetMsg,_SysBase(PC)
  1118. X        tst.l   d0
  1119. X        bne     tm8
  1120. X        tst.b   cbreak
  1121. X        bne     snoopend
  1122. X        bra     waitmem
  1123. Xtm8        move.l  d0,a3
  1124. X        move.l  20(a3),d3
  1125. X        btst    #31,d3
  1126. X        beq     freed
  1127. X        move.l  #allok,d0
  1128. X        bsr     putstr
  1129. X        lea     memname(PC),a2
  1130. X        lea     membit(PC),a4
  1131. X        moveq   #4,d5
  1132. Xtm2        move.l  0(a4),d4
  1133. X        btst    d4,d3
  1134. X        beq.s   tm1
  1135. X        move.l  0(a2),d0
  1136. X        bsr     putstr
  1137. Xtm1        addq    #4,a2
  1138. X        addq    #4,a4
  1139. X        dbf     d5,tm2
  1140. X        moveq   #26,d1
  1141. X        bsr     tab
  1142. X        move.l  24(a3),d0
  1143. X        move.l  d0,d3
  1144. X        bsr     hexa
  1145. X        move.l  28(a3),d0
  1146. X        bne.s   tm3
  1147. X        move.l  #failed,d0
  1148. X        bsr     putstr
  1149. X        moveq   #53,d1
  1150. X        bsr     tab
  1151. X        bra     tm4
  1152. Xtm3        bsr     hexa
  1153. X        move.l  28(a3),d0
  1154. X        add.l   d3,d0
  1155. X        bsr     hexa
  1156. X        bra     tm4
  1157. X
  1158. Xfreed        move.l  #free,d0
  1159. X        bsr     putstr
  1160. X        move.b  #'-',d0
  1161. X        moveq   #18,d1
  1162. Xtm9        bsr     putchar
  1163. X        dbf     d1,tm9
  1164. X        move.b  #' ',d0
  1165. X        bsr     putchar
  1166. X        move.l  d3,d0
  1167. X        bsr     hexa
  1168. X        move.l  24(a3),d0
  1169. X        bsr     hexa
  1170. X        move.l  24(a3),d0
  1171. X        add.l   d3,d0
  1172. X        bsr     hexa
  1173. X
  1174. Xtm4        move.l  32(a3),d0
  1175. X        bsr     hexa
  1176. X        bsr     newline
  1177. X        move.w  18(a3),d0
  1178. X        ext.l   d0
  1179. X        move.l  a3,a1
  1180. X        CALL    FreeMem,_SysBase(PC)
  1181. X        bra     tm7
  1182. X
  1183. Xsnoopend    move.l  _SysBase(PC),a1
  1184. X        move.l  oldalloc(PC),d0
  1185. X        move.l  #-198,a0
  1186. X        CALL    SetFunction,_SysBase(PC)
  1187. X        move.l  _SysBase(PC),a1
  1188. X        move.l  oldfree,d0
  1189. X        move.l  #-210,a0
  1190. X        CALL    SetFunction,_SysBase(PC)
  1191. X        move.l  snoopport,-(a7)
  1192. X        LIBCALL DeletePort
  1193. X        addq    #4,a7
  1194. X        move.l  #stoped,d0
  1195. X        bsr     putnam
  1196. X        clr.b   addlines
  1197. X        clr.l   auxsig
  1198. Xtm6        rts
  1199. X
  1200. Xmemname     dc.l    memlarg,memclr,memfast,memchip,mempubl
  1201. Xmembit        dc.l    17,16,2,1,0
  1202. X
  1203. Xcapmalloc   movem.l d0-d7/a0-a6,-(a7)
  1204. X        move.l  _SysBase(PC),a6
  1205. X        move.l  276(a6),d4
  1206. X        cmp.l   captask(PC),d4
  1207. X        bne.s   capm1
  1208. X        tst.b   bool
  1209. X        bne     capm1
  1210. X        move.b  #1,bool
  1211. X        moveq   #36,d6
  1212. X        bsr     allocmsg
  1213. X        beq     capm2
  1214. X        bset    #31,d1
  1215. X        move.l  d1,20(a5)
  1216. X        move.l  d0,24(a5)
  1217. X        move.l  60(a7),32(a5)
  1218. X        move.l  a5,remembr
  1219. X        movem.l (a7)+,d0-d7/a0-a6
  1220. X        bsr     memalloc
  1221. X        movem.l d0-d7/a0-a6,-(a7)
  1222. X        move.l  remembr(PC),a1
  1223. X        move.l  d0,28(a1)
  1224. X        move.l  snoopport,a0
  1225. X        move.b  #5,8(a1)
  1226. X        CALL    PutMsg,_SysBase(PC)
  1227. X        clr.b   bool
  1228. X        movem.l (a7)+,d0-d7/a0-a6
  1229. X        rts
  1230. Xcapm2        clr.b   bool
  1231. Xcapm1        movem.l (a7)+,d0-d7/a0-a6
  1232. Xmemalloc    dc.w    $4ef9
  1233. Xoldalloc    dc.l    0
  1234. X
  1235. Xcapmfree    movem.l d0-d7/a0-a6,-(a7)
  1236. X        move.l  _SysBase(PC),a6
  1237. X        move.l  276(a6),d4
  1238. X        cmp.l   captask(PC),d4
  1239. X        bne.s   capf1
  1240. X        tst.b   bool
  1241. X        bne.s   capf1
  1242. X        move.b  #1,bool
  1243. X        moveq   #36,d6
  1244. X        bsr     allocmsg
  1245. X        beq.s   capf2
  1246. X        move.l  d0,20(a5)
  1247. X        move.l  a1,24(a5)
  1248. X        move.l  60(a7),32(a5)
  1249. X        move.l  snoopport,a0
  1250. X        move.b  #5,8(a5)
  1251. X        move.l  a5,a1
  1252. X        CALL    PutMsg,_SysBase(PC)
  1253. Xcapf2        clr.b   bool
  1254. Xcapf1        movem.l (a7)+,d0-d7/a0-a6
  1255. X        dc.w    $4ef9
  1256. Xoldfree     dc.l    0
  1257. X
  1258. Xallocmsg    movem.l d0-d1/a0-a1,-(a7)
  1259. X        move.l  d6,d0
  1260. X        move.l  #65536,d1
  1261. X        bsr     memalloc
  1262. X        tst.l   d0
  1263. X        beq.s   alm1
  1264. X        move.l  d0,a5
  1265. X        move.w  d6,18(a5)
  1266. Xalm1        movem.l (a7)+,d0-d1/a0-a1
  1267. X        move.l  a5,d6
  1268. X        rts
  1269. X
  1270. Xmyswitch    movem.l d0-d1/a0-a1,-(a7)
  1271. X        move.l  _SysBase(PC),a0
  1272. X        move.l  276(a0),d0
  1273. X        move.l  tasksnum(PC),d1
  1274. X        lea     cputime,a0
  1275. X        subq.l  #1,d1
  1276. X        bmi.s   swadd
  1277. Xsw0        cmp.l   (a0)+,d0
  1278. X        dbeq    d1,sw0
  1279. X        tst     d1
  1280. X        bmi.s   swadd
  1281. Xswi1        add.l   #1,508(a0)
  1282. Xswgo        movem.l (a7)+,d0-d1/a0-a1
  1283. X        dc.w    $4ef9
  1284. Xoldswitch   dc.l    0
  1285. Xswadd        cmp.l   #125,tasksnum
  1286. X        bge.s   swgo
  1287. X        addq.l  #1,tasksnum
  1288. X        move.l  d0,0(a0)
  1289. X        move.l  #1,512(a0)
  1290. X        bra.s   swgo
  1291. X
  1292. Xcountio     addq.l #1,iocount
  1293. X        moveq  #0,d0
  1294. Xcio1        rts
  1295. X
  1296. Xiconbackdrp tst.b   iconifyon
  1297. X        beq.s   1$
  1298. X        lea     icnwindow,a0
  1299. X        eor.l   #$100,14(a0)    ;wn_Flags
  1300. X1$        rts
  1301. X
  1302. Xiconifyoff  tst.b   iconifyon
  1303. X        beq.s   cio1
  1304. X        clr.b   iconifyon
  1305. X        tst.b   fromfile
  1306. X        bne.s   1$
  1307. X        move.l  wnptr(PC),d0
  1308. X        beq.s   1$
  1309. X        move.l  d0,a0
  1310. X        lea     iconifgad,a1
  1311. X        CALL    RemoveGadget,intuibase(PC)
  1312. X        move.l  wnptr(PC),a0
  1313. X        CALL    RefreshWindowFrame,intuibase(PC)
  1314. X1$        move.l  #iconify,d0
  1315. X
  1316. Xkillseg     movem.l d1-d2/a0-a4,-(a7)
  1317. X        subq    #4,d0
  1318. X        move.l  4,a6
  1319. X        move.l  276(a6),a4
  1320. X        move.l  128(a4),d1
  1321. X        lsl.l   #2,d1
  1322. X        move.l  d1,a3
  1323. X        move.l  12(a3),d1
  1324. X        bne.s   2$
  1325. X        move.l  172(a4),d1
  1326. X        lsl.l   #2,d1
  1327. X        move.l  d1,a4
  1328. X        move.l  60(a4),d1
  1329. X
  1330. X2$        lsl.l   #2,d1
  1331. X        cmp.l   d0,d1
  1332. X        beq.s   4$
  1333. X        move.l  d1,a4
  1334. X        move.l  0(a4),d1
  1335. X        beq.s   5$
  1336. X        bra.s   2$
  1337. X
  1338. X4$        move.l  d1,a0
  1339. X        move.l  0(a0),0(a4)
  1340. X        clr.l   0(a0)
  1341. X        lsr.l   #2,d1
  1342. X        CALL    UnLoadSeg,dosbase(PC)
  1343. X        movem.l (a7)+,d1-d2/a0-a4
  1344. X5$        rts
  1345. X
  1346. Xalert        bsr     stoptimer
  1347. X        move.l  excpttask(PC),d0
  1348. X        bne.s   alert1
  1349. X        move.l  #noguru,d0
  1350. X        bra     putnam
  1351. Xalert1        move.l  #softfail,d0
  1352. X        bsr     putstr
  1353. X        move.l  excpttask(PC),a0
  1354. X        move.l  10(a0),d0
  1355. X        bsr     putnam
  1356. X        cmp.l   #3,excpterror
  1357. X        bne.s   1$
  1358. X        move.l  #addrserr,d0
  1359. X        bsr     putstr
  1360. X        move.l  excptaddr(PC),d0
  1361. X        bsr     hexa
  1362. X        bsr     newline
  1363. X1$        move.l  #procount,d0
  1364. X        bsr     putstr
  1365. X        move.l  excptpc(PC),d0
  1366. X        bsr     hexa
  1367. X        bsr     newline
  1368. X        move.l  #gurutxt,d0
  1369. X        bsr     putstr
  1370. X        move.l  excpterror(PC),d0
  1371. X        bsr     hexa
  1372. X        lea     out,a0
  1373. X        move.l  ptr(PC),d0
  1374. X        move.b  #'.',-1(a0,d0)
  1375. X        move.l  excpttask(PC),d0
  1376. X        bsr     hexa
  1377. X        bra     newline
  1378. X
  1379. Xshowguru    bsr     alert
  1380. X        tst.b   ownscreen
  1381. X        bne.s   5$
  1382. X        move.l  wnptr(PC),a0
  1383. X        CALL    WindowToFront,intuibase(PC)
  1384. X        bra.s   2$
  1385. X5$        move.l  screenptr,a0
  1386. X        CALL    ScreenToFront,intuibase(PC)
  1387. X2$        move.l  #whatnow,d0
  1388. X        bsr     putnam
  1389. X        clr.l   oldpageend
  1390. X        bsr     readline
  1391. X
  1392. X        cmp.b   #'i',inputbuffer
  1393. X        beq.s   4$
  1394. X1$        cmp.b   #'k',inputbuffer
  1395. X        bne.s   2$
  1396. X        move.l  excpttask(PC),a1
  1397. X        tst.l   22(a1)
  1398. X        bne.s   3$
  1399. X        CALL    RemTask,_SysBase(PC)
  1400. X        bra.s   4$
  1401. X3$        move.l  a1,d0
  1402. X        bsr     canok
  1403. X4$        clr.l   lastprinted
  1404. X        rts
  1405. X
  1406. Xmyaddtask   move.l  a3,-(a7)
  1407. X        lea     mytrap(PC),a3
  1408. X        move.l  50(a1),d0
  1409. X        beq.s   1$
  1410. X        cmp.l   oldtrap(PC),d0
  1411. X        beq.s   1$
  1412. X        lea     myproctrap(PC),a3
  1413. X        cmp.l   oldproctrap(PC),d0
  1414. X        bne.s   2$
  1415. X1$        move.l  a3,50(a1)
  1416. X2$        move.l  (a7)+,a3
  1417. X        dc.w    $4ef9
  1418. XOldAddTask  dc.l    0
  1419. X
  1420. Xmyproctrap  bsr     traphandle
  1421. X        dc.w    $4ef9
  1422. Xoldproctrap dc.l    0
  1423. X
  1424. Xmytrap        bsr     traphandle
  1425. X        moveq   #0,d0
  1426. X        CALL    Wait,_SysBase(PC)
  1427. X        dc.w    $4ef9
  1428. Xoldtrap     dc.l    0
  1429. X
  1430. Xtraphandle  movem.l d0-d7/a0-a6,$180
  1431. X        move.l  4,a6
  1432. X        move.l  276(a6),excpttask
  1433. X        move.l  4(a7),d0
  1434. X        cmp.l   #9,d0
  1435. X        beq.s   2$
  1436. X        move.l  d0,excpterror
  1437. X        moveq   #10,d1
  1438. X        cmp.l   #3,d0
  1439. X        bne.s   1$
  1440. X        move.l  0(a7,d1.w),excptaddr
  1441. X        moveq   #18,d1
  1442. X1$        move.l  0(a7,d1.w),excptpc
  1443. X        move.l  mytask(PC),a1
  1444. X        move.l  trapsignal(PC),d0
  1445. X        jsr     _LVOSignal(a6)
  1446. X2$        movem.l $180,d0-d7/a0-a6
  1447. X        rts
  1448. X
  1449. Xtrapguru    tst.b   wanttraps
  1450. X        bne     restoretrap
  1451. X        move.b  #1,wanttraps
  1452. X
  1453. Xaddtraps    tst.b   wanttraps
  1454. X        beq     5$
  1455. X        move.l  304(a6),oldtrap         ;Original EXEC trap handler
  1456. X        moveq   #-1,d0
  1457. X        CALL    AllocSignal,_SysBase(PC)
  1458. X        moveq   #0,d1
  1459. X        bset    d0,d1
  1460. X        move.l  d1,trapsignal
  1461. X        move.l  #_LVOAddTask,a0        ;need a new AddTask() to change
  1462. X        move.l  2(a6,a0),OldAddTask     ;AmigaDos's default trap handler
  1463. X        move.l  a6,a1
  1464. X        move.l  #myaddtask,d0
  1465. X        CALL    SetFunction,_SysBase(PC)
  1466. X        CALL    Forbid,_SysBase(PC)     ;change the trap handler of
  1467. X        moveq   #0,d5            ;aleady running tasks
  1468. X        bsr     getaskdat            ;get task stucture pointers
  1469. X1$        tst.b   entries
  1470. X        beq.s   2$
  1471. X        lea     -16(a5),a5
  1472. X        move.l  0(a5),a4                ;pointer to a task structure
  1473. X        lea     myproctrap(PC),a0
  1474. X        move.l  50(a4),d0               ;Task->tc_TrapCode
  1475. X        cmp.l   oldproctrap(PC),d0      ;AmigaDos Handler ?
  1476. X        beq.s   3$
  1477. X        lea     mytrap(PC),a0           ;EXEC Handler ?
  1478. X        cmp.l   oldtrap(PC),d0
  1479. X        bne.s   4$                ;must be a custom one, skip it
  1480. X3$        move.l  a0,50(a4)               ;replace it
  1481. X4$        subq.b  #1,entries
  1482. X        bra.s   1$
  1483. X2$        CALL    Permit,_SysBase(PC)
  1484. X5$        rts
  1485. X
  1486. Xrestoretrap tst.b   wanttraps
  1487. X        beq.s   6$
  1488. X        tst.b   fromfile
  1489. X        bne.s   5$
  1490. X        move.l  #_LVOAddTask,a0
  1491. X        move.l  OldAddTask(PC),d0
  1492. X        move.l  _SysBase(PC),a1
  1493. X        CALL    SetFunction,_SysBase(PC)
  1494. X        CALL    Forbid,_SysBase(PC)
  1495. X        bsr     getaskdat
  1496. X1$        tst.b   entries
  1497. X        beq.s   2$
  1498. X        lea     -16(a5),a5
  1499. X        move.l  0(a5),a4
  1500. X        move.l  oldproctrap(PC),a0
  1501. X        move.l  50(a4),d0
  1502. X        cmp.l   #myproctrap,d0
  1503. X        beq.s   3$
  1504. X        move.l  oldtrap(PC),a0
  1505. X        cmp.l   #mytrap,d0
  1506. X        bne.s   4$
  1507. X3$        move.l  a0,50(a4)
  1508. X4$        subq.b  #1,entries
  1509. X        bra.s   1$
  1510. X2$        CALL    Permit,_SysBase(PC)
  1511. X        clr.l   trapsignal
  1512. X5$        clr.b   wanttraps
  1513. X6$        rts
  1514. X
  1515. X;save the contents of the output buffer
  1516. X;to a file
  1517. Xsaveoutput  bsr     nodenam2
  1518. X        tst.b   0(a5)
  1519. X        beq     syntax
  1520. X        move.l  a5,d1
  1521. X        move.l  #1006,d2
  1522. X        CALL    Open,dosbase(PC)
  1523. X        move.l  d0,d5
  1524. X        bne.s   1$
  1525. X        move.l  #openerr,d0
  1526. X        bsr     putstr
  1527. X        move.l  a5,d0
  1528. X        bra     putnam
  1529. X1$        move.l  outchain(PC),d0
  1530. X        beq.s   3$
  1531. X2$        move.l  d0,a5
  1532. X        move.w  12(a5),d3
  1533. X        beq.s   4$
  1534. X        ext.l   d3
  1535. X        lea     14(a5),a1
  1536. X        move.l  a1,d2
  1537. X        move.l  d5,d1
  1538. X        CALL    Write,dosbase(PC)
  1539. X        tst.l   d0
  1540. X        ble.s   3$
  1541. X4$        moveq   #1,d3
  1542. X        move.l  d5,d1
  1543. X        move.l  #cr,d2
  1544. X        CALL    Write,dosbase(PC)
  1545. X        tst.l   d0
  1546. X        ble.s   3$
  1547. X        move.l  0(a5),d0
  1548. X        bne.s   2$
  1549. X3$        move.l  d5,d1
  1550. X        CALL    Close,dosbase(PC)
  1551. X        rts
  1552. X
  1553. Xgrabtimerio lea     tiohead(PC),a0
  1554. X        bsr     puthead
  1555. X        move.b  timeout(PC),d4
  1556. X        move.b  #255,timeout
  1557. X        bsr     starttimer
  1558. X        move.b  d4,timeout
  1559. X        lea     timerio,a1
  1560. X        CALL    Disable,_SysBase(PC)
  1561. X2$        move.l  0(a1),d2
  1562. X        beq.s   1$
  1563. X        move.l  d2,a1
  1564. X        bra.s   2$
  1565. X1$        CALL    Enable,_SysBase(PC)
  1566. X        lea     -4(a1),a5
  1567. X        bsr     stoptimer
  1568. X        lea     buffer,a4
  1569. X        moveq   #1,d4
  1570. X        bsr     gettrq
  1571. X
  1572. X        lea     timerio,a0
  1573. X        lea     dummy,a1
  1574. X        moveq   #40,d0
  1575. X        CALL    CopyMem,_SysBase(PC)
  1576. X
  1577. X        lea     dummy,a1
  1578. X        lea     timernam(PC),a0
  1579. X        moveq   #0,d1
  1580. X        moveq   #0,d0
  1581. X        CALL    OpenDevice,_SysBase(PC)
  1582. X
  1583. X        lea     dummy,a1
  1584. X        move.l  #1<<30,32(a1)
  1585. X        CALL    SendIO,_SysBase(PC)
  1586. X
  1587. X        lea     dummy,a5
  1588. X        CALL    Disable,_SysBase(PC)
  1589. X8$        move.l  0(a5),d2
  1590. X        beq.s   7$
  1591. X        move.l  d2,a5
  1592. X        bra.s   8$
  1593. X7$        CALL    Enable,_SysBase(PC)
  1594. X        lea     -4(a5),a5
  1595. X
  1596. X        lea     dummy,a1
  1597. X        CALL    AbortIO,_SysBase(PC)
  1598. X        lea     timerio,a1
  1599. X        CALL    WaitIO,_SysBase(PC)
  1600. X        move.w  timersig,d0
  1601. X        moveq   #0,d1
  1602. X        bset    d0,d1
  1603. X        moveq   #0,d0
  1604. X        CALL    SetSignal,_SysBase(PC)
  1605. X
  1606. X        moveq   #0,d4
  1607. X        bsr     gettrq
  1608. X
  1609. X        lea     dummy,a1
  1610. X        CALL    CloseDevice,_SysBase(PC)
  1611. X
  1612. X        clr.l   (a4)+
  1613. X        lea     -22(a4),a2
  1614. X        moveq   #18,d2
  1615. X        bsr     sortlist
  1616. X
  1617. X        lea     buffer,a5
  1618. X5$        move.l  (a5)+,d0
  1619. X        beq.s   6$
  1620. X        bsr     hexa
  1621. X        move.w  (a5)+,d0
  1622. X        ext.l   d0
  1623. X        mulu    #9,d0
  1624. X        add.l   #timerunits,d0
  1625. X        bsr     putstr
  1626. X        move.l  (a5)+,d3
  1627. X        mulu    #10,d3
  1628. X        move.l  (a5)+,d0
  1629. X        move.l  #100000,d1
  1630. X        bsr     div
  1631. X        add.l   d3,d0
  1632. X        cmp.l   #2559,d0
  1633. X        ble.s   9$
  1634. X        move.l  #whatsthis,d0
  1635. X        bsr     putstr
  1636. X        bra.s   10$
  1637. X9$        moveq   #1,d6
  1638. X        bsr     putfrac
  1639. X10$        move.b  #' ',d0
  1640. X        bsr     putchar
  1641. X        move.l  (a5)+,a1
  1642. X        move.l  10(a1),d0
  1643. X        bsr     putnam
  1644. X        bra.s   5$
  1645. X6$        rts
  1646. X
  1647. Xgettrq        CALL    Disable,_SysBase(PC)
  1648. X3$        move.l  0(a5),a5
  1649. X        tst.l   0(a5)
  1650. X        beq.s   4$
  1651. X        move.l  a5,(a4)+
  1652. X        move.w  d4,(a4)+
  1653. X        move.l  32(a5),(a4)+
  1654. X        move.l  36(a5),(a4)+
  1655. X        move.l  14(a5),a1
  1656. X        move.l  16(a1),(a4)+
  1657. X        bra.s   3$
  1658. X4$        CALL    Enable,_SysBase(PC)
  1659. X        rts
  1660. X
  1661. X
  1662. X;check if the timer is runnig, start it if not
  1663. Xstarttimer  lea     timerio,a1
  1664. X        cmp.b   #5,8(a1)
  1665. X        beq.s   1$
  1666. X        moveq   #0,d0
  1667. X        move.l  d0,36(a1)
  1668. X        move.b  timeout(PC),d0
  1669. X        beq.s   1$
  1670. X        move.l  d0,32(a1)
  1671. X        move.w  #9,28(a1)
  1672. X        CALL    SendIO,_SysBase(PC)
  1673. X1$        rts
  1674. X;Abort a timer request, if pending
  1675. Xstoptimer   lea     timerio,a1
  1676. X        cmp.b   #5,8(a1)
  1677. X        bne.s   1$
  1678. X        CALL    AbortIO,_SysBase(PC)
  1679. X        lea     timerio,a1
  1680. X        CALL    WaitIO,_SysBase(PC)
  1681. X1$        move.w  timersig,d0
  1682. X        moveq   #0,d1
  1683. X        bset    d0,d1
  1684. X        moveq   #0,d0
  1685. X        CALL    SetSignal,_SysBase(PC)
  1686. X        rts
  1687. X;Xoper main loop, process all incoming messages
  1688. Xprocessmsgs move.l  wnptr(PC),a0
  1689. X        moveq   #0,d0
  1690. X        move.w  intuisig(PC),d1
  1691. X        bset    d1,d0
  1692. X        move.w  timersig(PC),d1
  1693. X        bset    d1,d0
  1694. X        or.w    #4096,d0
  1695. X        or.l    auxsig(PC),d0
  1696. X        tst.l   auxsig
  1697. X        bne.s   1$
  1698. X        or.l    trapsignal(PC),d0
  1699. X1$        CALL    Wait,_SysBase(PC)
  1700. X
  1701. X        move.l  d0,tasksigs
  1702. X
  1703. X        move.l  trapsignal(PC),d1
  1704. X        and.l   d0,d1
  1705. X        beq.s   ctrl_c
  1706. X        tst.b   gotguru
  1707. X        bne.s   ctrl_c
  1708. X        move.b  #1,gotguru
  1709. X        bsr     showguru
  1710. X        clr.b   gotguru
  1711. X
  1712. Xctrl_c        move.q  #12,d1
  1713. X        bsr     testsig
  1714. X        bne     exit
  1715. X
  1716. X
  1717. Xtimermsg    move.w  timersig(PC),d1
  1718. X        bsr     testsig
  1719. X        beq     intuimsgs
  1720. X        tst.w   repeat
  1721. X        bne.s   1$
  1722. X        bsr     showwhat
  1723. X        bra.s   intuimsgs
  1724. X1$        move.w  repeatlen,d0
  1725. X        lea     repeatbuffer,a2
  1726. X        lea     dummy,a1
  1727. X        move.w  d0,d1
  1728. X2$        move.b  (a2)+,(a1)+
  1729. X        dbf     d1,2$
  1730. X        bsr     cli
  1731. X        bsr     starttimer
  1732. X
  1733. Xintuimsgs   move.w  intuisig(PC),d1
  1734. X        bsr     testsig
  1735. X        beq     processnxtmsg
  1736. Xnextimsg    move.l  wnptr(PC),a0
  1737. X        move.l  $56(a0),a0
  1738. X        CALL    GetMsg,_SysBase(PC)
  1739. X        tst.l   d0
  1740. X        beq     processnxtmsg
  1741. X        move.l  d0,intuimsg
  1742. X
  1743. X        move.l  d0,a0
  1744. X        move.l  20(a0),d0
  1745. X
  1746. X        cmp.l   #$200,d0        ;CloseWindow
  1747. X        bne.s   1$
  1748. X        tst.b   addlines
  1749. X        beq     exitall
  1750. X        move.b  #1,cbreak
  1751. X        bra     intuiend
  1752. X
  1753. X1$        cmp.l   #2,d0        ;ResizeWindow
  1754. X        bne.s   2$
  1755. X        bsr     setupscreen
  1756. X        bra     intuiend
  1757. X
  1758. X2$        cmp.l   #4,d0        ;refresh
  1759. X        bne.s   22$
  1760. X        bsr     putiline
  1761. X        bsr     blastout
  1762. X        bsr     UpdateIArea
  1763. X        bra     intuiend
  1764. X
  1765. X22$        tst.b   addlines
  1766. X        bne     3$
  1767. X        cmp.l   #$40,d0        ;gadgetup
  1768. X        bne.s   3$
  1769. X        tst.w   getanswer
  1770. X        bne.s   3$
  1771. X        bsr     replyintui
  1772. X        bra     instback
  1773. X
  1774. X3$        cmp.l   #$400,d0        ;RawKey
  1775. X        bne     notarawkey
  1776. X        move.w  #$80,d0
  1777. X        and.w   24(a0),d0
  1778. X        bne     intuiend
  1779. X        and.w   #$7f,24(a0)
  1780. X        lea     ievent,a1
  1781. X        move.b  #1,4(a1)
  1782. X        move.l  24(a0),6(a1)
  1783. X        move.w  26(a0),qualifier
  1784. X        move.l  a1,a0
  1785. X        lea     outevent,a1
  1786. X        moveq   #20,d1
  1787. X        suba.l  a2,a2
  1788. X        CALL    RawKeyConvert,condev(PC)
  1789. X        tst.l   d0
  1790. X        beq     intuiend
  1791. X        lea     inputbuffer,a1
  1792. X        lea     outevent,a2
  1793. X        move.w  curpos(PC),d4
  1794. X        moveq   #0,d3
  1795. X        tst.b   addlines
  1796. X        bne     197$
  1797. X
  1798. X        cmp.b   #$9b,0(a2)          ;CSI
  1799. X        bne     110$
  1800. X
  1801. X        cmp.b   #'?',1(a2)          ;help
  1802. X        bne.s   399$
  1803. X        tst.w   getanswer
  1804. X        bne.s   399$
  1805. X        bsr     stoptimer
  1806. X        tst.w   bottomin
  1807. X        bne.s   398$
  1808. X        move.w  #1,bottomin
  1809. X        clr.w   ibufferlen
  1810. X        clr.w   curpos
  1811. X        bsr     UpdateIArea
  1812. X398$        move.l  #usetxt,d0
  1813. X        bsr     putnam
  1814. X        clr.l   lastprinted
  1815. X        bsr     blastout
  1816. X        bra.s   420$
  1817. X
  1818. X399$        cmp.b   #'C',1(a2)          ;cursor right
  1819. X        bne.s   400$
  1820. X        cmp.w   ibufferlen(PC),d4
  1821. X        bge.s   420$
  1822. X        addq    #1,d4
  1823. X421$        move.w  d4,curpos
  1824. X420$        bra     100$
  1825. X
  1826. X400$        cmp.b   #'D',1(a2)          ;cursor left
  1827. X        bne.s   401$
  1828. X        subq    #1,d4
  1829. X        bpl.s   421$
  1830. X        bra.s   420$
  1831. X
  1832. X401$        cmp.b   #' ',1(a2)
  1833. X        bne.s   402$
  1834. X
  1835. X        cmp.b   #'@',2(a2)          ;shift right
  1836. X        bne.s   403$
  1837. X
  1838. X404$        cmp.w   ibufferlen(PC),d4
  1839. X        bge.s   421$
  1840. X        addq    #1,d4
  1841. X        cmp.b   #' ',0(a1,d4)
  1842. X        bne.s   404$
  1843. X405$        cmp.w   ibufferlen(PC),d4
  1844. X        bge.s   421$
  1845. X        addq    #1,d4
  1846. X        cmp.b   #' ',0(a1,d4)
  1847. X        beq.s   405$
  1848. X        bra.s   421$
  1849. X
  1850. X403$        cmp.b   #'A',2(a2)          ;shift left
  1851. X        bne.s   420$
  1852. X406$        tst.w   d4
  1853. X        beq.s   421$
  1854. X        subq    #1,d4
  1855. X        cmp.b   #' ',0(a1,d4)
  1856. X        beq.s   406$
  1857. X407$        tst.w   d4
  1858. X        beq.s   421$
  1859. X        subq    #1,d4
  1860. X        cmp.b   #' ',0(a1,d4)
  1861. X        bne.s   407$
  1862. X        addq    #1,d4
  1863. X        bra.s   421$
  1864. X
  1865. X402$        cmp.b   #'A',1(a2)          ;cursor up
  1866. X        bne.s   408$
  1867. X        tst.w   bottomin
  1868. X        bne.s   480$
  1869. X        tst.w   curpos
  1870. X        bne.s   480$
  1871. X
  1872. X        clr.w   curpos
  1873. X        clr.w   ibufferlen
  1874. X        bsr     UpdateIArea
  1875. X        bsr     clrcursor
  1876. X        move.w  edline(PC),d3
  1877. X        ext.l   d3
  1878. X        tst.w   d3
  1879. X        beq.s   481$
  1880. X        subq    #1,d3
  1881. X        cmp.l   firstline(PC),d3
  1882. X        bge.s   481$
  1883. X        move.l  d3,-(a7)
  1884. X        subq.l  #1,firstline
  1885. X        bsr     blastout
  1886. X        move.l  (a7)+,d3
  1887. X481$        move.w  d3,edline
  1888. X        bsr     getcurpos
  1889. X        bsr     putcursor
  1890. X        bra     intuiend
  1891. X480$        move.l  history(PC),a0
  1892. X        tst.l   0(a0)
  1893. X        beq.s   423$
  1894. X        move.l  curhist(PC),a1
  1895. X        cmp.l   a0,a1
  1896. X        beq.s   409$
  1897. X        move.l  4(a1),d0
  1898. X        move.l  d0,curhist
  1899. X409$        move.l  a1,gothline
  1900. X        bsr     copyhistory
  1901. X423$        bra     100$
  1902. X
  1903. X408$        cmp.b   #'B',1(a2)          ;cursor down
  1904. X        bne     410$
  1905. X        tst.w   bottomin
  1906. X        bne.s   414$
  1907. X        tst.w   curpos
  1908. X        bne.s   414$
  1909. X
  1910. X        clr.w   curpos
  1911. X        clr.w   ibufferlen
  1912. X        bsr     UpdateIArea
  1913. X        bsr     clrcursor
  1914. X        move.w  edline(PC),d3
  1915. X        ext.l   d3
  1916. X        move.l  numlines(PC),d4
  1917. X        subq    #1,d4
  1918. X        cmp.l   d4,d3
  1919. X        beq.s   490$
  1920. X        move.l  firstline(PC),d2
  1921. X        add.w   rows(PC),d2
  1922. X        subq    #1,d2
  1923. X        addq    #1,d3
  1924. X        cmp.w   d2,d3
  1925. X        ble.s   490$
  1926. X        move.l  d3,-(a7)
  1927. X        addq.l  #1,firstline
  1928. X        bsr     blastout
  1929. X        move.l  (a7)+,d3
  1930. X490$        bra     481$
  1931. X414$        move.l  curhist(PC),d0
  1932. X        beq.s   423$
  1933. X        move.l  d0,a1
  1934. X        move.l  0(a1),a1
  1935. X        tst.l   0(a1)
  1936. X        bne.s   411$
  1937. X        clr.l   gothline
  1938. X        clr.w   curpos
  1939. X        clr.w   ibufferlen
  1940. X        bra     423$
  1941. X411$        move.l  a1,curhist
  1942. X        bra     409$
  1943. X
  1944. X410$        cmp.b   #'T',1(a2)          ;shift up
  1945. X        bne.s   412$
  1946. X        tst.w   hnum
  1947. X        beq     423$
  1948. X        move.l  history(PC),a1
  1949. X        move.l  a1,curhist
  1950. X        bra     409$
  1951. X
  1952. X412$        cmp.b   #'S',1(a2)          ;shift down
  1953. X        bne     423$
  1954. X        tst.w   hnum
  1955. X        beq     423$
  1956. X        move.l  history+8,curhist
  1957. X        bra.s   414$
  1958. X
  1959. X110$        moveq   #0,d3
  1960. X101$        move.w  curpos(PC),d4
  1961. X        tst     d0
  1962. X        beq     100$
  1963. X        cmp.b   #13,0(a2,d3)        ;return
  1964. X        beq     got_enter
  1965. X
  1966. X        cmp.b   #27,0(a2,d3)        ;esc
  1967. X        bne     799$
  1968. X        tst.w   getanswer
  1969. X        bne     100$
  1970. X        clr.b   insmode
  1971. X        clr.w   ibufferlen
  1972. X        move.w  #200,curpos
  1973. X        bsr     UpdateIArea
  1974. X        clr.w   curpos
  1975. X        tst.w   bottomin
  1976. X        bne.s   700$
  1977. X        move.w  #1,bottomin
  1978. X        bsr     getcurpos
  1979. X        cmp.b   #5,timerstate
  1980. X        bne.s   765$
  1981. X        bsr     starttimer
  1982. X765$        bra     100$
  1983. X
  1984. X700$        move.b  timerio+8,timerstate
  1985. X        bsr     stoptimer
  1986. X        move.w  edline(PC),d0
  1987. X        move.l  firstline(PC),d4
  1988. X        cmp.w   d4,d0
  1989. X        bmi.s   701$
  1990. X        move.w  d4,d5
  1991. X        add.w   rows(PC),d5
  1992. X        cmp.w   d5,d0
  1993. X        bmi.s   702$
  1994. X701$        move.w  rows(PC),d0
  1995. X        lsr.w   #1,d0
  1996. X        add.w   d4,d0
  1997. X702$        move.l  numlines(PC),d3
  1998. X        subq    #1,d3
  1999. X        cmp.w   d3,d0
  2000. X        ble.s   703$
  2001. X        move.w  d3,d0
  2002. X703$        move.w  d0,edline
  2003. X        sub.w   d4,d0
  2004. X        lsl.w   #3,d0
  2005. X        add.w   #18,d0
  2006. X        move.w  d0,cposy
  2007. X        clr.w   bottomin
  2008. X        tst.w   loffset
  2009. X        beq.s   704$
  2010. X        clr.w   loffset
  2011. X        bsr     blastout
  2012. X704$        bra     100$
  2013. X
  2014. X799$        cmp.b   #8,0(a2,d3)         ;Backspace
  2015. X        bne.s   114$
  2016. X        tst.w   d4
  2017. X        beq     102$
  2018. X        bsr     delchar
  2019. X        subq    #1,d4
  2020. X        move.w  d4,curpos
  2021. X        bra     102$
  2022. X
  2023. X114$        cmp.b   #127,0(a2,d3)       ;del
  2024. X        bne.s   197$
  2025. X178$        cmp.w   ibufferlen(PC),d4
  2026. X        bge     102$
  2027. X        addq    #1,d4
  2028. X        bsr     delchar
  2029. X        bra     102$
  2030. X
  2031. X197$        cmp.b   #3,0(a2,d3)         ;ctrl c
  2032. X        bne.s   104$
  2033. X        move.b  #1,cbreak
  2034. X
  2035. X104$        tst.b   addlines
  2036. X        bne     processnxtmsg
  2037. X        cmp.b   #$18,0(a2,d3)       ;ctrl x
  2038. X        bne.s   300$
  2039. X        clr.w   ibufferlen
  2040. X        clr.w   curpos
  2041. X        bra     100$
  2042. X
  2043. X300$        cmp.b   #$19,0(a2,d3)       ;ctrl y
  2044. X        bne.s   106$
  2045. X        move.w  curpos,ibufferlen
  2046. X        bra     100$
  2047. X
  2048. X106$        move.w  #$100,d5        ;NumPad
  2049. X        and.w   qualifier(PC),d5
  2050. X        beq     105$
  2051. X        move.l  firstline(PC),d5
  2052. X
  2053. X        cmp.b   #'7',0(a2,d3)       ;'Home'
  2054. X        bne.s   200$
  2055. X        moveq   #0,d5
  2056. X199$        move.l  d5,firstline
  2057. X        bsr     blastout
  2058. X        tst.w   bottomin
  2059. X        bne.s   196$
  2060. X        move.w  edline(PC),d0
  2061. X        move.l  firstline(PC),d1
  2062. X        cmp.w   d1,d0
  2063. X        bmi.s   190$
  2064. X        add.w   rows(PC),d1
  2065. X        cmp.w   d1,d0
  2066. X        bmi.s   192$
  2067. X190$        clr.w   curpos
  2068. X        clr.w   ibufferlen
  2069. X        move.w  rows(PC),d0
  2070. X        lsr.w   #1,d0
  2071. X        ext.l   d0
  2072. X        add.l   firstline(PC),d0
  2073. X        cmp.l   numlines(PC),d0
  2074. X        bmi.s   191$
  2075. X        move.l  numlines(PC),d0
  2076. X        subq    #1,d0
  2077. X191$        move.w  d0,edline
  2078. X192$        bsr     getcurpos
  2079. X        bsr     UpdateIArea
  2080. X196$        bra     100$
  2081. X
  2082. X200$        cmp.b   #'8',0(a2,d3)       ;'up arrow'
  2083. X        bne.s   201$
  2084. X        tst     d5
  2085. X        beq     100$
  2086. X        subq    #1,d5
  2087. X        bra.s   199$
  2088. X
  2089. X201$        cmp.b   #'9',0(a2,d3)       ;'PgUp'
  2090. X        bne.s   203$
  2091. X        sub.w   rows(PC),d5
  2092. X        bpl.s   199$
  2093. X        moveq   #0,d5
  2094. X        bra.s   199$
  2095. X
  2096. X203$        cmp.b   #'1',0(a2,d3)       ;'End'
  2097. X        bne.s   205$
  2098. X222$        move.l  numlines(PC),d5
  2099. X        sub.w   rows(PC),d5
  2100. X        bpl     199$
  2101. X        moveq   #0,d5
  2102. X204$        bra     199$
  2103. X
  2104. X205$        cmp.b   #'2',0(a2,d3)       ;'down arrow'
  2105. X        bne.s   206$
  2106. X        move.l  d5,d2
  2107. X        add.w   rows(PC),d2
  2108. X        cmp.l   numlines(PC),d2
  2109. X        bge     100$
  2110. X        addq    #1,d5
  2111. X        bra     199$
  2112. X
  2113. X206$        cmp.b   #'3',0(a2,d3)       ;'PgDn'
  2114. X        bne.s   500$
  2115. X        add.w   rows(PC),d5
  2116. X        move.l  d5,d2
  2117. X        add.w   rows(PC),d2
  2118. X        cmp.l   numlines(PC),d2
  2119. X        bge.s   222$
  2120. X        bra     199$
  2121. X
  2122. X500$        cmp.b   #'4',0(a2,d3)       ;left arrow
  2123. X        bne.s   501$
  2124. X        tst.w   bottomin
  2125. X        beq     102$
  2126. X        move.w  loffset(PC),d2
  2127. X        sub.w   colms(PC),d2
  2128. X        bpl.s   502$
  2129. X        moveq   #0,d2
  2130. X502$        move.w  d2,loffset
  2131. X        bsr     blastout
  2132. X        bra     100$
  2133. X
  2134. X501$        cmp.b   #'6',0(a2,d3)       ;right arrow
  2135. X        bne.s   170$
  2136. X        tst.w   bottomin
  2137. X        beq     102$
  2138. X        move.w  loffset(PC),d2
  2139. X        add.w   colms(PC),d2
  2140. X        bra.s   502$
  2141. X
  2142. X170$        cmp.b   #'0',0(a2,d3)       ;Ins
  2143. X        bne.s   177$
  2144. X        eor.b   #1,insmode
  2145. X        bra.s   102$
  2146. X
  2147. X177$        cmp.b   #'.',0(a2,d3)       ;Del
  2148. X        beq     178$
  2149. X
  2150. X105$        tst.w   bottomin
  2151. X        bne.s   777$
  2152. X        tst.w   curpos
  2153. X        bne.s   777$
  2154. X        movem.l d0-d1,-(a7)
  2155. X        move.w  edline(PC),d0
  2156. X        bsr     findline
  2157. X        movem.l (a7)+,d0-d1
  2158. X        tst.l   8(a5)
  2159. X        beq     intuiend
  2160. X777$        move.w  curpos(PC),d5
  2161. X        ext.l   d5
  2162. X        moveq   #79,d2
  2163. X        cmp.w   d2,d5
  2164. X        bge     102$
  2165. X        tst.b   insmode
  2166. X        beq.s   172$
  2167. X        cmp.w   ibufferlen(PC),d5
  2168. X        bmi.s   171$
  2169. X        bra.s   173$
  2170. X172$        sub     d5,d2
  2171. X        lea     80(a1),a4
  2172. X        lea     79(a1),a3
  2173. X103$        move.b  -(a3),-(a4)
  2174. X        dbf     d2,103$
  2175. X173$        addq.w  #1,ibufferlen
  2176. X171$        move.b  0(a2,d3),0(a1,d5)
  2177. X        addq.w  #1,curpos
  2178. X102$        subq    #1,d0
  2179. X        addq    #1,d3
  2180. X        bra     101$
  2181. X
  2182. X100$        bsr     UpdateIArea
  2183. X        bra     intuiend
  2184. X
  2185. Xgot_enter   bsr     stoptimer
  2186. X        bsr     puthist
  2187. X        clr.b   insmode
  2188. X        lea     dummy,a1
  2189. X        lea     inputbuffer,a2
  2190. X        move.w  ibufferlen(PC),d2
  2191. X        beq.s   2$
  2192. X        tst.w   bottomin
  2193. X        bne.s   5$
  2194. X        movem.l a1-a2,-(a7)
  2195. X        move.w  edline(PC),d0
  2196. X        bsr     findline
  2197. X        move.l  8(a5),d0
  2198. X        bsr     gthex
  2199. X        lea     hexarea(PC),a0
  2200. X        lea     0(a2,d2),a1
  2201. X        move.b  #' ',(a1)+
  2202. X        move.b  #'$',(a1)+
  2203. X        moveq   #8,d0
  2204. X        CALL    CopyMem,_SysBase(PC)
  2205. X        move.w  ibufferlen(PC),d2
  2206. X        add.w   #10,d2
  2207. X        move.w  d2,ibufferlen
  2208. X        movem.l (a7)+,a1-a2
  2209. X5$        subq    #1,d2
  2210. X1$        move.b  (a2)+,(a1)+
  2211. X        dbf     d2,1$
  2212. X2$        move.b  #10,(a1)+
  2213. X        move.w  ibufferlen(PC),d0
  2214. X        ext.l   d0
  2215. X        addq    #1,d0
  2216. X        move.l  d0,-(a7)
  2217. X        clr.w   ibufferlen
  2218. X        tst.w   bottomin
  2219. X        bne.s   4$
  2220. X        move.w  #100,curpos
  2221. X        bsr     UpdateIArea
  2222. X4$        clr.w   curpos
  2223. X        move.w  #1,bottomin
  2224. X        bsr     getcurpos
  2225. X        bsr     UpdateIArea
  2226. X        move.l  (a7)+,d0
  2227. X        move.w  d0,repeatlen
  2228. X        clr.w   repeat
  2229. X        clr.b   printed
  2230. X        tst.w   getanswer
  2231. X        beq.s   6$
  2232. X        rts
  2233. X6$        bsr     cli
  2234. X        tst.b   printed
  2235. X        bne.s   3$
  2236. X        bsr     starttimer
  2237. X3$        bra     intuiend
  2238. X
  2239. Xnotarawkey
  2240. X
  2241. Xintuiend    bsr.s   replyintui
  2242. X        bra     nextimsg
  2243. Xprocessnxtmsg
  2244. X        tst.b   addlines
  2245. X        beq.s   1$
  2246. X        rts
  2247. X1$        bra     processmsgs
  2248. X
  2249. Xreplyintui  move.l  intuimsg(PC),d0
  2250. X        beq.s   1$
  2251. X        move.l  d0,a1
  2252. X        CALL    ReplyMsg,_SysBase
  2253. X1$        clr.l   intuimsg
  2254. X        rts
  2255. X
  2256. X;put an input line into the history buffer
  2257. Xputhist     move.w  ibufferlen(PC),d5
  2258. X        move.l  d5,d0
  2259. X        cmp.w   minnumchars(PC),d0
  2260. X        bcs     1$
  2261. X
  2262. X        move.l  gothline(PC),d1
  2263. X        beq.s   5$
  2264. X        move.l  d1,a2
  2265. X        cmp.w   8(a2),d5
  2266. X        bne.s   5$
  2267. X        lea     10(a2),a2
  2268. X        lea     inputbuffer,a1
  2269. X        subq    #1,d0
  2270. X6$        cmp.b   (a2)+,(a1)+
  2271. X        bne.s   5$
  2272. X        dbf     d0,6$
  2273. X        move.l  gothline,curhist
  2274. X        bra.s   1$
  2275. X
  2276. X5$        move.w  d5,d0
  2277. X        ext.l   d0
  2278. X        add     #10,d0
  2279. X        move.l  #$10000,d1         ;MEMF_CLEAR
  2280. X        CALL    AllocMem,_SysBase(PC)
  2281. X        tst.l   d0
  2282. X        beq.s   1$
  2283. X        move.l  d0,a0
  2284. X        move.w  d5,8(a0)
  2285. X        lea     10(a0),a2
  2286. X        subq    #1,d5
  2287. X        lea     inputbuffer,a1
  2288. X2$        move.b  (a1)+,(a2)+
  2289. X        dbf     d5,2$
  2290. X        move.w  hnum(PC),d5
  2291. X        cmp.w   maxhlines(PC),d5
  2292. X        bmi.s   3$
  2293. X        bsr     remhistline
  2294. X        bra.s   4$
  2295. X3$        addq    #1,d5
  2296. X        move.w  d5,hnum
  2297. X4$        move.l  d0,a1
  2298. X        move.l  d0,curhist
  2299. X        lea     history(PC),a0
  2300. X        CALL    AddTail,_SysBase(PC)
  2301. X1$        clr.l   gothline
  2302. X        rts
  2303. X
  2304. X;copy a history line into the input buffer
  2305. Xcopyhistory lea     inputbuffer,a0
  2306. X        move.w  8(a1),d3
  2307. X        ext.l   d3
  2308. X        move.w  d3,curpos
  2309. X        move.w  d3,ibufferlen
  2310. X        subq    #1,d3
  2311. X        lea     10(a1),a1
  2312. X1$        move.b  (a1)+,(a0)+
  2313. X        dbf     d3,1$
  2314. X        rts
  2315. X;remove one line from the history buffer
  2316. X;pointer to the line in A1, returns pointer to the next line in d1
  2317. Xremhistline move.l  d0,-(a7)
  2318. X        lea     history(PC),a0
  2319. X        move.l  0(a0),a5
  2320. X        tst.l   0(a5)
  2321. X        beq.s   1$
  2322. X        CALL    RemHead,_SysBase(PC)
  2323. X        move.l  a5,a1
  2324. X        move.w  8(a1),d0
  2325. X        add     #10,d0
  2326. X        ext.l   d0
  2327. X        CALL    FreeMem,_SysBase(PC)
  2328. X1$        move.l  (a7)+,d0
  2329. X        rts
  2330. X
  2331. X;kill all history lines
  2332. Xkillhistory bsr     remhistline
  2333. X        move.l  history(PC),a0
  2334. X        tst.l   0(a0)
  2335. X        bne.s   killhistory
  2336. X2$        clr.w   hnum
  2337. X        clr.l   curhist
  2338. X        rts
  2339. X;delete one char from the input line
  2340. Xdelchar     lea     inputbuffer,a3
  2341. X        lea     0(a3,d4.w),a3
  2342. X        lea     -1(a3),a4
  2343. X        move    d4,d5
  2344. X1$        cmp.w   #78,d5
  2345. X        bge.s   2$
  2346. X        move.b  (a3)+,(a4)+
  2347. X        addq    #1,d5
  2348. X        bra.s   1$
  2349. X2$        subq.w  #1,ibufferlen
  2350. X        rts
  2351. X
  2352. Xtestsig     move.l  tasksigs(PC),d0
  2353. X        btst    d1,d0
  2354. X        rts
  2355. X
  2356. X;get the position of the input area
  2357. Xiareapos    move.l  wnptr(PC),a0
  2358. X        move.w  10(a0),d0
  2359. X        subq    #4,d0
  2360. X        move.w  d0,ipos
  2361. X        rts
  2362. X
  2363. X;Update the current position of the input line
  2364. Xgetcurpos   tst.w   bottomin
  2365. X        beq.s   1$
  2366. X        move.w  ipos,cposy
  2367. X        rts
  2368. X1$        move.w  edline(PC),d3
  2369. X        sub.l   firstline(PC),d3
  2370. X        lsl     #3,d3
  2371. X        add.w   #18,d3
  2372. X        move.w  d3,cposy
  2373. X        rts
  2374. X;refresh the input area
  2375. XUpdateIArea move.l  rastport(PC),a1
  2376. X        move.l  #1,d0
  2377. X        CALL    SetDrMd,gfxbase(PC)
  2378. X        moveq   #6,d0
  2379. X        move.w  cposy(PC),d1
  2380. X        CALL    Move,gfxbase(PC)
  2381. X        lea     inputbuffer,a0
  2382. X        move.w  ibufferlen(PC),d0
  2383. X        ext.l   d0
  2384. X        move.w  colms(PC),d1
  2385. X        sub.w   bottomin(PC),d1
  2386. X        cmp.w   d1,d0
  2387. X        bmi.s   1$
  2388. X        move.w  d1,d0
  2389. X1$        move.w  d0,d2
  2390. X        CALL    Text,gfxbase(PC)
  2391. X
  2392. X        tst.w   bottomin
  2393. X        bne.s   3$
  2394. X        move.w  edline(PC),d0
  2395. X        bsr     findline
  2396. X        move.w  12(a5),d3
  2397. X        sub.w   d2,d3
  2398. X        bmi.s   3$
  2399. X        move.w  colms(PC),d1
  2400. X        sub.w   d2,d1
  2401. X        bmi.s   2$
  2402. X        cmp.w   d1,d3
  2403. X        ble.s   4$
  2404. X        move.w  d1,d3
  2405. X4$        move.w  d3,d0
  2406. X        lea     14(a5,d2.w),a0
  2407. X        move.l  rastport(PC),a1
  2408. X        CALL    Text,gfxbase(PC)
  2409. X        add.w   ibufferlen(PC),d3
  2410. X        move.w  d3,d2
  2411. X
  2412. X3$        move.w  colms(PC),d0
  2413. X        sub.w   bottomin(PC),d0
  2414. X        move.l  blanks(PC),a0
  2415. X        ext.l   d0
  2416. X        sub.w   d2,d0
  2417. X        bmi.s   2$
  2418. X        lea     0(a0,d2.w),a0
  2419. X        move.l  rastport(PC),a1
  2420. X        CALL    Text,gfxbase(PC)
  2421. X2$        bsr     putcursor
  2422. X        rts
  2423. X
  2424. Xclrcursor   moveq   #1,d7
  2425. X        bra.s   ptc1
  2426. Xputcursor   moveq   #6,d7
  2427. Xptc1        move.w  curpos(PC),d0
  2428. X        move.w  colms(PC),d1
  2429. X        subq    #1,d1
  2430. X        sub.w   bottomin(PC),d1
  2431. X        cmp.w   d0,d1
  2432. X        bmi.s   1$
  2433. X        move.l  rastport(PC),a1
  2434. X        move.l  d7,d0
  2435. X        CALL    SetDrMd,gfxbase(PC)
  2436. X        move.w  cposy(PC),d1
  2437. X        move.w  curpos(PC),d0
  2438. X        lsl.w   #3,d0
  2439. X        addq    #6,d0
  2440. X        CALL    Move,gfxbase(PC)
  2441. X        lea     oneblank(PC),a0
  2442. X        moveq   #1,d0
  2443. X        CALL    Text,gfxbase(PC)
  2444. X1$        rts
  2445. X;rebuild the window from scratch
  2446. Xsetupscreen move.l  rastport(PC),a1
  2447. X        moveq   #0,d0
  2448. X        CALL    SetRast,gfxbase(PC)
  2449. X        move.l  wnptr,a0
  2450. X        CALL    RefreshWindowFrame,intuibase(PC)
  2451. X        bsr     getwindowsize
  2452. X        tst.w   bottomin
  2453. X        bne.s   1$
  2454. X        move.w  edline(PC),d0
  2455. X        move.l  firstline(PC),d1
  2456. X        move.w  rows(PC),d2
  2457. X        move.w  d2,d4
  2458. X        move.w  numlines(PC),d3
  2459. X        add.w   d1,d2
  2460. X        cmp.w   d2,d0
  2461. X        bmi.s   2$
  2462. X        lsr.w   #1,d4
  2463. X        sub.w   d4,d0
  2464. X        ext.l   d0
  2465. X        move.l  d0,firstline
  2466. X2$        bsr     tstfirstlin
  2467. X1$        bsr     getcurpos
  2468. X        bsr     putiline
  2469. X        bsr     blastout
  2470. X        bsr     UpdateIArea
  2471. X        move.w  rows,currenty
  2472. X        rts
  2473. X
  2474. Xputiline    move.l  rastport(PC),a1
  2475. X        moveq   #1,d0
  2476. X        CALL    SetAPen,gfxbase(PC)
  2477. X        move.l  rastport(PC),a1
  2478. X        moveq   #1,d0
  2479. X        CALL    SetDrMd,gfxbase(PC)
  2480. X        move.l  wnptr(PC),a5
  2481. X        move.w  10(a5),d1
  2482. X        sub.w   #12,d1
  2483. X        moveq   #0,d0
  2484. X        CALL    Move,gfxbase(PC)
  2485. X        move.w  8(a5),d0
  2486. X        move.w  d1,-(a7)
  2487. X        CALL    Draw,gfxbase(PC)
  2488. X        move.w  (a7)+,d1
  2489. X        tst.b   ownscreen
  2490. X        bne.s   1$
  2491. X        move.w  8(a5),d0
  2492. X        addq    #1,d1
  2493. X        CALL    Move,gfxbase(PC)
  2494. X        sub.w   #16,d0
  2495. X        move.w  d1,-(a7)
  2496. X        CALL    Draw,gfxbase(PC)
  2497. X        move.w  (a7)+,d1
  2498. X        move.w  8(a5),d0
  2499. X        addq    #1,d1
  2500. X        CALL    Move,gfxbase(PC)
  2501. X        sub.w   #16,d0
  2502. X        CALL    Draw,gfxbase(PC)
  2503. X1$        rts
  2504. X
  2505. Xgetwindowsize
  2506. X        bsr     freeblank
  2507. X        move.l  wnptr(PC),a0
  2508. X        move.w  10(a0),d0
  2509. X        sub.w   #26,d0
  2510. X        lsr.w   #3,d0
  2511. X        move.w  d0,rows
  2512. X        move.w  8(a0),d0
  2513. X        sub.w   #12,d0
  2514. X        lsr.w   #3,d0
  2515. X        move.w  d0,colms
  2516. X        ext.l   d0
  2517. X        moveq   #0,d1
  2518. X        move.l  d0,d6
  2519. X        CALL    AllocMem,_SysBase(PC)
  2520. X        move.l  d0,blanks
  2521. X        move.l  d0,a0
  2522. X        subq    #1,d6
  2523. X1$        move.b  #' ',(a0)+
  2524. X        dbf     d6,1$
  2525. X        bsr     iareapos
  2526. X        rts
  2527. X
  2528. Xreadline    move.b  #'n',inputbuffer
  2529. X        tst.b   fromfile
  2530. X        bne.s   1$
  2531. X        move.l  #31000,firstline
  2532. X        bsr     blastout
  2533. X        move.w  #1,getanswer
  2534. X        bsr     replyintui
  2535. X5$        bsr     processmsgs
  2536. X        move.w  d0,d5
  2537. X        bsr     replyintui
  2538. X        subq    #1,d5
  2539. X        beq.s   5$
  2540. X        ori.b   #$20,inputbuffer
  2541. X        clr.w   getanswer
  2542. X        bsr     RestoreOutput
  2543. X1$        rts
  2544. X
  2545. XResumeOutput
  2546. X        move.l  outchain(PC),d0
  2547. X        move.l  d0,a1
  2548. X        beq.s   2$
  2549. X        move.l  numlines,oldnumlines
  2550. X        move.l  firstline,oldfirstline
  2551. X4$        tst.l   0(a1)
  2552. X        beq.s   3$
  2553. X        move.l  0(a1),a1
  2554. X        bra.s   4$
  2555. X3$        move.l  a1,lastprinted
  2556. X2$        move.l  a1,oldpageend
  2557. X        rts
  2558. X
  2559. XRestoreOutput
  2560. X        move.l  oldpageend(PC),d3
  2561. X        beq.s   1$
  2562. X        move.l  oldnumlines(PC),numlines
  2563. X        move.l  oldfirstline(PC),firstline
  2564. X        move.l  oldlastprinted(PC),lastprinted
  2565. X        move.l  d3,a1
  2566. X        move.l  0(a1),a1
  2567. X        bsr     killlines
  2568. X        move.l  d3,a1
  2569. X        clr.l   0(a1)
  2570. X        bsr     blastout
  2571. X1$        rts
  2572. X
  2573. Xaddline     movem.l d0-d6/a0-a3,-(a7)
  2574. X        move.l  rastport(PC),a1
  2575. X        moveq   #1,d0
  2576. X        CALL    SetAPen,gfxbase(PC)
  2577. X        move.l  rastport(PC),a1
  2578. X        moveq   #1,d0
  2579. X        CALL    SetDrMd,gfxbase(PC)
  2580. X        move.w  currenty(PC),d6
  2581. X        cmp.w   rows(PC),d6
  2582. X        bmi.s   1$
  2583. X        bsr     cls
  2584. X1$        move.l  lastprinted(PC),a0
  2585. X        move.w  colms(PC),d5
  2586. X        move.w  12(a0),d3
  2587. X        lea     14(a0),a0
  2588. X        move.w  currenty(PC),d6
  2589. X        move    d6,d7
  2590. X        lsl     #3,d6
  2591. X        add.w   #18,d6
  2592. X        moveq   #0,d4
  2593. X        bsr     blastline
  2594. X        addq.w  #1,currenty
  2595. X        move.l  #31000,firstline
  2596. X        movem.l (a7)+,d0-d6/a0-a3
  2597. X        rts
  2598. X
  2599. Xcls        movem.l d0-d6/a0-a3,-(a7)
  2600. X        move.l  rastport(PC),a1
  2601. X        moveq   #1,d0
  2602. X        CALL    SetAPen,gfxbase(PC)
  2603. X        move.l  rastport(PC),a1
  2604. X        moveq   #1,d0
  2605. X        CALL    SetDrMd,gfxbase(PC)
  2606. X        move.w  colms(PC),d5
  2607. X        clr.w   d2
  2608. X1$        move.w  d2,d6
  2609. X        move    d5,d7
  2610. X        lsl     #3,d6
  2611. X        add.w   #18,d6
  2612. X        moveq   #0,d3
  2613. X        move.l  blanks(PC),a0
  2614. X        bsr     blastline
  2615. X        addq    #1,d2
  2616. X        cmp.w   rows(PC),d2
  2617. X        bmi.s   1$
  2618. X        clr.w   currenty
  2619. X        movem.l (a7)+,d0-d6/a0-a3
  2620. X        rts
  2621. X
  2622. Xcreatescreen moveq  #1,d1
  2623. X        moveq   #80,d0
  2624. X        lea     buffer,a0
  2625. X        sub.l   a1,a1
  2626. X        CALL    GetScreenData,intuibase(PC)
  2627. X        move.w  buffer+76,nsviewmode
  2628. X        move.l  buffer+12,nssize
  2629. X        lea     newscreen(PC),a0
  2630. X        CALL    OpenScreen,intuibase(PC)
  2631. X        move.l  d0,screenptr
  2632. X        move.l  d0,nwscreen
  2633. X        move.w  #$f,nwtype
  2634. X        beq.s   setupwindow
  2635. X        tst.l   wnptr
  2636. X        beq.s   1$
  2637. X        move.l  wnptr(PC),a0
  2638. X        move.l  4(a0),window_l
  2639. X        move.l  8(a0),window_w
  2640. X        CALL    CloseWindow,intuibase(PC)
  2641. X        clr.l   intuimsg
  2642. X        clr.l   wnptr
  2643. X1$        clr.l   newwindow
  2644. X        move.l  buffer+12,newwindow+4
  2645. X        move.l  wnscrflags(PC),nwflgs
  2646. X        move.l  wnscrflags+4(PC),nwflgs+4
  2647. X        move.b  #1,ownscreen
  2648. X
  2649. Xsetupwindow tst.b   ownscreen
  2650. X        bne.s   3$
  2651. X        move.l  window_l(PC),newwindow
  2652. X        move.l  window_w(PC),newwindow+4
  2653. X        move.w  #1,nwtype
  2654. X        move.l  wnnormflgs(PC),nwflgs
  2655. X        move.l  wnnormflgs+4(PC),nwflgs+4
  2656. X3$        lea     newwindow(PC),a0
  2657. X        CALL    OpenWindow,intuibase(PC)
  2658. X        move.l  d0,wnptr
  2659. X        beq     exit
  2660. X        move.l  d0,a0
  2661. X        move.l  50(a0),rastport    ;wn->RPort
  2662. X        move.l  86(a0),a1          ;wn->UserPort
  2663. X        move.b  15(a1),d1          ;MsgPort->SigBit
  2664. X        ext.w   d1
  2665. X        move.w  d1,intuisig
  2666. X
  2667. X        tst.b   iconifyon
  2668. X        beq.s   1$
  2669. X        tst.b   ownscreen
  2670. X        bne.s   1$
  2671. X        lea     iconifgad,a1
  2672. X        moveq   #0,d0
  2673. X        CALL    AddGadget,intuibase(PC)
  2674. X        move.l  wnptr(PC),a0
  2675. X        CALL    RefreshWindowFrame,intuibase(PC)
  2676. X
  2677. X1$        lea     tattr(PC),a0
  2678. X        CALL    OpenFont,gfxbase(PC)
  2679. X        tst.l   d0
  2680. X        beq.s   2$
  2681. X        move.l  d0,a0
  2682. X        move.l  rastport(PC),a1
  2683. X        CALL    SetFont,gfxbase(PC)
  2684. X2$        bsr     getwindowsize
  2685. X        bsr     getcurpos
  2686. X
  2687. X        bsr     putiline
  2688. X        bsr     UpdateIArea
  2689. X        bsr     starttimer
  2690. X        bsr     showwhat
  2691. X        rts
  2692. X
  2693. Xusescreen   tst.b   fromfile
  2694. X        bne.s   1$
  2695. X        tst.b   ownscreen
  2696. X        bne.s   1$
  2697. X        bsr     createscreen
  2698. X1$        move.b  #1,ownscreen
  2699. X        rts
  2700. X
  2701. Xusewindow   tst.b   fromfile
  2702. X        beq.s   1$
  2703. X        clr.b   ownscreen
  2704. X        rts
  2705. X1$        tst.b   ownscreen
  2706. X        beq.s   2$
  2707. X        move.l  wnptr(PC),d0
  2708. X        beq.s   3$
  2709. X        move.l  d0,a0
  2710. X        CALL    CloseWindow,intuibase(PC)
  2711. X        clr.l   wnptr
  2712. X        clr.l   intuimsg
  2713. X3$        move.l  screenptr(PC),d0
  2714. X        beq.s   4$
  2715. X        move.l  d0,a0
  2716. X        CALL    CloseScreen,intuibase(PC)
  2717. X        clr.l   screenptr
  2718. X        clr.b   ownscreen
  2719. X4$        bra     setupwindow
  2720. X2$        rts
  2721. X
  2722. Xdchange     lea     dchead(PC),a0
  2723. X        bsr     puthead
  2724. X        lea     tdd(PC),a1
  2725. X        move.l  _SysBase(PC),a0
  2726. X        lea     350(a0),a0
  2727. X        CALL    FindName,_SysBase(PC)
  2728. X        tst.l   d0
  2729. X        beq     R_T_S
  2730. X        move.l  d0,a2
  2731. X        lea     32(a2),a2
  2732. X        moveq   #0,d5
  2733. X2$        lea     4(a2),a2
  2734. X        move.l  0(a2),d0
  2735. X        beq     3$
  2736. X        move.l  d0,a0
  2737. X        lea     $18e(a0),a0
  2738. X        CALL    Disable,_SysBase(PC)
  2739. X5$        tst.l   0(a0)
  2740. X        beq.s   6$
  2741. X        move.l  0(a0),a0
  2742. X        bra.s   5$
  2743. X6$        lea     -4(a0),a5
  2744. X        lea     buffer+100,a3
  2745. X9$        move.l  0(a5),a5
  2746. X        tst.l   0(a5)
  2747. X        beq.s   11$
  2748. X        move.l  a5,(a3)+
  2749. X        bne.s   9$
  2750. X11$        clr.l   (a3)+
  2751. X        CALL    Enable,_SysBase(PC)
  2752. X        lea     buffer+100,a3
  2753. X7$        move.l  (a3)+,d0
  2754. X        beq.s   3$
  2755. X        move.l  d0,a5
  2756. X        cmp.w   #20,28(a5)
  2757. X        bne.s   7$
  2758. X        move.l  40(a5),a4
  2759. X        move.l  a4,d0
  2760. X        move.l  d0,node
  2761. X        bsr     hexan
  2762. X        move.l  a4,d0
  2763. X        beq.s   10$
  2764. X        move.l  14(a4),d0
  2765. X        bsr     hexan
  2766. X        move.l  18(a4),d0
  2767. X        bsr     hexan
  2768. X10$        move.l  d5,d3
  2769. X        or.b    #48,d3
  2770. X        move.b  d3,tddrives+2
  2771. X        move.l  #tddrives,d0
  2772. X        bsr     putstr
  2773. X        move.l  14(a5),d0
  2774. X        beq.s   8$
  2775. X        move.l  d0,a0
  2776. X        move.l  16(a0),d0
  2777. X        beq.s   8$
  2778. X        move.l  d0,a0
  2779. X        move.l  10(a0),d0
  2780. X8$        bsr     putnam
  2781. X        bra.s   7$
  2782. X3$        addq    #1,d5
  2783. X        cmp.w   #4,d5
  2784. X        bmi     2$
  2785. XR_T_S        rts
  2786. X
  2787. Xdosbase     dc.l    0
  2788. Xintuibase   dc.l    0
  2789. Xgfxbase     dc.l    0
  2790. Xcondev        dc.l    0
  2791. Xparmtxt     dc.l    0
  2792. Xfileptr     dc.l    0
  2793. Xinfile        dc.l    0
  2794. Xptr        dc.l    0
  2795. Xoldidl        dc.l    0
  2796. Xolddisp     dc.l    0
  2797. Xmysignal    dc.l    0
  2798. Xauxsig        dc.l    0
  2799. Xtrapsignal  dc.l    0
  2800. Xiostatus    dc.l    -1
  2801. Xdevstatus   dc.l    -1
  2802. Xtasksigs    dc.l    0
  2803. Xcancelbit   dc.l    0
  2804. Xcancelbnum  dc.l    0
  2805. X_SysBase    dc.l    0
  2806. XInputMsg    dc.l    0
  2807. XInRequest   dc.l    0
  2808. Xstartmess   dc.l    0
  2809. Xsavedat     dc.l    0
  2810. Xwnptr        dc.l    0
  2811. Xaliaslist   dc.l    0
  2812. Xscreenptr   dc.l    0
  2813. Xintuimsg    dc.l    0
  2814. Xmytask        dc.l    0
  2815. Xwbmsg        dc.l    0
  2816. Xpointer     dc.l    0
  2817. Xreplyport   dc.l    0
  2818. Xtimerport   dc.l    0
  2819. Xfinfoptr    dc.l    0
  2820. Xmyseg        dc.l    0
  2821. Xdispatches  dc.l    0
  2822. Xmaxdisp     dc.l    0
  2823. Xdeltadisp   dc.l    0
  2824. Xwbaddr        dc.l    0
  2825. Xnode        dc.l    0
  2826. Xremembr     dc.l    0
  2827. Xremembr2    dc.l    0
  2828. SHAR_EOF
  2829. echo "End of archive 2 (of 3)"
  2830. # if you want to concatenate archives, remove anything after this line
  2831. exit
  2832.